17 de mayo de 2016

37. Módulo SYS. Flujo de datos estándar.

SYS

Para saber más http://www.python-course.eu/sys_module.php 

El módulo sys provee funcionalidad referida al intérprete Python.
Variables
sys.argv
Retorna una lista con todos los argumentos pasados por línea de comandos. Al ejecutar python modulo.py arg1 arg2, retornará una lista: ['modulo.py', 'arg1', 'arg2']
sys.executable
Retorna el path absoluto del binario ejecutable del intérprete de Python
sys.maxint
Retorna el número positivo entero mayor, soportado por Python
sys.platform
Retorna la plataforma sobre la cuál se está ejecutando el intérprete
sys.version
Retorna el número de versión de Python con información adicional
Métodos
sys.exit()
Forzar la salida del intérprete
sys.getdefaultencoding()
Retorna la codificación de caracteres por defecto
sys.getfilesystemencoding()
Retorna la codificación de caracteres que se utiliza para convertir los nombres de archivos unicode en nombres de archivos del sistema
sys.getsizeof(object[, default])
Retorna el tamaño del objeto pasado como parámetro. El segundo argumento (opcional) es retornado cuando el objeto no devuelve nada.
Más documentación en la página oficial del módulo sys.
= = =
Ejemplo 1
Este programa imprimirá la versión de Python y saldrá antes de imprimir "Hola"
# -*- coding: utf-8 -*-
import os, sys

print sys.version
print sys.exit()
print "Hola"
 

Flujos de datos estándar

En relación a un terminal, tenemos lo que se conoce como "pipes" (tuberías). Cada terminal se conecta normalmente a tres tuberías estándar: una de entrada , stdin, normalmente el teclado. Otra de salida, normalmente conectada a la ventana del terminal, stdout y la otra, también conectada a la ventana, de errores, stderr.
Se puede acceder directamente a estas tuberías a través del módulo sys.
# -*- coding: utf-8 -*-

import os, sys

print sys.stdin
print sys.stdout
print sys.stderr Como podemos observar tienen el carácter de "ficheros", siendo stdin de lectura y los otros dos de escritura.
Escribo y leo datos
# -*- coding: utf-8 -*-

import os, sys

print "Escribo algo"
sys.stdout.write("Escribo algo de otra forma")
print "\n"

cadena = raw_input("Di algo...: ")
print cadena
print "Escribe algo más...", sys.stdin.readline()[:-1]
= = =
Ejemplo de programa
# -*- coding: utf-8 -*-

import sys

while True:
  # Escribo
  print "Otra vez..."
  try:
    # Escribiendo desde stdin. Para salir CTRL + C
    print "Introduce un número: ", ;
    number = sys.stdin.readline()[:-1]
    # number = raw_input("")
number = int(number)
  except EOFError:
    print "\nHasta luego, Lucas"
    break
  except ValueError:
    print "\nNo es un número"
  else:
    if number == 0:
      print >> sys.stderr, "0 no tiene inverso"
    else:
      print "inverso de %d es %f" % (number, 1.0/number)

Prueba a entrar en un terminal de Linux, shell, navega hasta la carpeta donde está el programa y ejecútalo (python numeros.py). Imagina que le has puesto el nombre numeros.py. Bien, ahora escribe un pequeño fichero de texto con diez números del 0 al 10 y llámalo numeros.txt (en la misma carpeta que numeros.py)
  • Descomenta la línea que introduce el número como raw_input.
  • Comenta la que lo introduce como stdin.
  • Escribe la orden siguiente python numeros.py < numeros.txt
Comprueba como el programa lee los números desde el fichero, no aceptando la introducción de datos del teclado sino desde el fichero. Asimismo si escribo...
  • python numeros.py < numeros.txt > inversos.txt
Se genera un fichero de salida  inversos.txt y no se muestra la información en pantalla. Tanto los inputs como los prints (excepto el print redirigido a sys.stderr) se dirigen ahora a los nuevos ficheros que indican las entradas y las salidas de datos.
= = =
Redirecciono
En un programa puede cambiarse el comportamiento de stdout o stdin. Por ejemplo, en este programa se guarda el "fichero" stdout a una variable, se abre un fichero y se redirige la salida stdout a ese fichero. Todo lo que se "imprima" ahora no lo hace en la pantalla, sino en el fichero. Se recupera la situación inicial y se cierra el fichero abierto.
import sys

print("Usando stdout")

# stdout se guarda
save_stdout = sys.stdout

fh = open("test.txt","w")

sys.stdout = fh
print("Esta línea se escribe en test.txt")

# se recupera stdout:
sys.stdout = save_stdout

fh.close()
= = =
Redirecciono la salida de errores
O puedo redireccionar la salida de los errores.  Al cometer un error (dividir entre 0), se escribe en el fichero o escribiendo con print directamente.
import sys

save_stderr = sys.stderr
fh = open("errors.txt","w")
sys.stderr = fh

# Comentar / descomentar la siguiente línea
# x = 10 / 0
print >> sys.stderr, "escribe en error.txt"

# return to normal:
sys.stderr = save_stderr

fh.close()
 

No hay comentarios:

Publicar un comentario