Curso Python DGA 2011/sistemas/entradas salidas
De WikiEducator
Contenido
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>>>
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)