Flujos de datos estándar
En sistemas UNIX, los programas básicamente manejan tres flujos de datos estándar:
- Entrada estándar (
stdin
) -> Permite recibir datos del usuario o de otro programa. - Salida estándar (
stdout
) -> Se emplea para usar resultados correctos del programa. - Salida de errores (
stderr
) -> Se usa para mostrar mensajes de error sin mezclarlos con la salida estándar.
Python hace uso de estos tres flujos, y podemos acceder a ellos en sys.stdin
, sys.stdout
y sys.stderr
.
Sin embargo, no haremos uso de ellos de forma directa, sino que emplearemos funciones específicas básicas como print
, input
para interactuar con el usuario.
Y el módulo logging
para depurar nuestro código.
Salida estándar
El método print()
envía datos a la salida estándar, la cual generalmente es la terminal. Internamente hace uso de sys.stdin
.
print("Hola, mundo!") # Salida estándar normal
Entrada estándar
Se usa input()
para recibir datos del usuario desde la terminal.
nombre = input("Introduce tu nombre: ")
print(f"Hola, {nombre}!")
Errores y depuración
Nuestros programas pueden generar errores, por lo que es fundamental que no se mezclen con la salida estándar. Para evitarlo, las excepciones (Exceptions
), que interrumpen el flujo normal de ejecución del programa, envían sus mensajes a la salida de errores sys.stderr
.
En la sección Control de flujo e Iterables veremos cómo gestionarlas correctamente.
Es una buena práctica desarrollar software trazable, es decir, que proporcione información detallada sobre su funcionamiento en cada momento. Esto facilita la monitorización y depuración en cualquier entorno.
Para ello, es recomendable llevar un registro de eventos o logs. Estos registros también se envían a sys.stderr
. En lugar de escribir directamente en esta salida, utilizamos el módulo logging
, que nos ofrece distintos niveles de registro:
DEBUG
: Mensajes de depuraciónINFO
: Información generalWARNING
: AdvertenciasERROR
: Errores no fatalesCRITICAL
: Errores graves
El módulo logging
es la mejor opción para registrar eventos y depurar el programa, ya que es más flexible y organizado. Usar print
para esto no es recomendable.
Mientras que en el entorno de producción se suele hacer uso de los niveles WARNING
, ERROR
y CRITICAL
; en desarrollo se usan todos los niveles para obtener detalles sobre el funcionamiento del programa y detectar problemas.
Ejemplo de uso:
import logging
# Configuración básica del log
logging.basicConfig(level=logging.DEBUG, format='%(levelname)s: %(message)s')
logging.debug("Mensaje de depuración") # Solo visible si el nivel es DEBUG
logging.info("Mensaje informativo")
logging.warning("Advertencia")
logging.error("Error detectado")
logging.critical("Error crítico")