Curso Python DGA 2011/sistemas/entradas salidas

De WikiEducator
< Curso Python DGA 2011‎ | sistemas
Revisión a fecha de 19:41 30 ago 2011; Luis.perez (Discusión | contribuciones)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar

Entradas y salidas en Python

Escribir a la salida estandar y de error

Python maneja las salidas estandar y de error a través de sys.stdout y sys.stderr

>>> print "Hola, mundo"
Hola, mundo
>>> import sys
>>> sys.stdout.write("Hola, mundo")
Hola, mundo>>>
>>> sys.stderr.write("Hola, error");
Hola, error>>>
  • stdout y stderr son objetos que se comportan como ficheros (recordar: duck-typing), aunque cuidado: solo de lectura

Redireccionando las salidas estandar y de error

Habitualmente en un programa, las salidas estandar y de error escribirán a la consola, pero podemos redireccionarlas para que escriban en un fichero, simplemente reasignando sys.stdout y sys.stderr

  • redireccionando stdout:
# redirect_stdout.py
import sys
 
print("Redireccionando salida")
 
with open('out.log', 'w') as logfile:
    oldout = sys.stdout
    sys.stdout = logfile
    print("Esto irá al fichero out.log")
    sys.stdout = oldout
  • redireccionando stderr:
# redirect_stderr.py
print("Redireccionando errores")
 
logfile = open('errors.log', 'w')
sys.stderr = logfile
raise Exception, "Este error aparecerá en errors.log"
  • cuidado con usar "with" en este caso!:
# redirect_stderr_bad.py
print("Redireccionando errores")
 
with open('errors.log', 'w') as logfile:
    olderr = sys.stderr
    sys.stderr = logfile
    raise Exception, "Este error NO aparecerá en ningún sitio"
  • Escribiendo puntualmente a la salida de error usando print:
>>> print >> sys.stderr, "one error" #print statement
>>> from __future__ import print_function
>>> print("one error", file=sys.stderr) #print function
one error

Leyendo de entrada estandar

Podemos leer de la entrada estandar de nuestro programa a través de sys.stdin. De esta forma podemos hacer que nuestro programa python pueda participar en una cadena usando pipes.

#stdinecho.py
import sys
 
for line in sys.stdin:
    print line
$ for i in `seq 1 5`; do echo $i; done | ./stdin.py
 
1
 
2
 
3
 
4
 
5

Manejando argumentos de linea de comandos

  • Los argumentos se reciben como una lista en sys.argv
#argecho.py
import sys
 
for arg in sys.argv:
  print arg
$ ./argecho.py arg1 -a arg3
./argecho.py
arg1
-a
arg3
  • El primer argumento es el propio script invocado

Manejando argumentos con el módulo getopt

  • La función getopt del módulo getopt recibe varios parámetros que indican cómo parsear las opciones:
    • la lista de argumentos que se obtiene con sys.argv: debemos evitar pasar el primer argumento (el propio script)
    • una cadena que indica las opciones abreviadas (ej: -h)
    • una cadena que indica los opciones largas (ej: --help)
  • Devuelve una tupla de opciones y argumentos. Las opciones son un array de tuplas que contienen cada una de las opciones que el usuario ha pasado junto con sus argumentos (si los hay). Los argumentos son el resto de elementos que se pasan en la invocación del script que no son opciones.
try:
    opts, args = getopt.getopt(sys.argv[1:], "hs:u:v", ["help", "subject=", "user="])
except getopt.GetoptError:
    print_usage()
    sys.exit(2)
 
for opt, arg in opts:
    if opt in ("-h", "--help"):
        print_usage()
        sys.exit()
    elif opt == '-v':
        verbose=True
    elif opt in ("-s", "--subject"):
        subject = arg
    elif opt in ("-u", "--user"):
        user = arg
 
message = " ".join(args)