la ventana acoplable no se imprime en la aplicación Python

Cuando se usa una statement print() en una aplicación Python que se ejecuta dentro de un contenedor Docker que está administrado por Docker Compose, solo se registra la salida de sys.stderr . No se ven las declaraciones de Vanilla print() , así que esto:

 print("Hello? Anyone there?") 

… nunca aparece en los registros regulares:

introduzca la descripción de la imagen aquí

(Puedes ver otros registros impresos explícitamente por otras libretas en mi aplicación, pero ninguna de mis propias llamadas).

¿Cómo puedo evitar que mis llamadas print() sean ignoradas?

De forma predeterminada, Python almacena la salida en sys.stdout .

Hay algunas opciones:

1. Llamar a una flush explícita

Refactorice la statement de impresión original para incluir una palabra clave flush=True , como:

 print("Hello? Anyone there?", flush=True) 

Nota: Esto hará que todo el búfer se vacíe, no solo la misma llamada de impresión. Por lo tanto, si hay llamadas de función de impresión “simples” en otros lugares (es decir, sin flush=True ) que no se excluyeron explícitamente, estas también se vaciarán también.

Podrías lograr lo mismo con:

 import sys sys.stdout.flush() 

Esta opción es útil si desea tener el mayor control sobre cuándo ocurrirá el lavado.

2. Desempaquetar la aplicación completa a través de la env. PYTHONUNBUFFERED

Coloque lo siguiente en la sección de environment de su archivo docker-compose.yml :

PYTHONUNBUFFERED: 1

Esto hará que toda la salida a la salida stdout se vacíe inmediatamente.

3. Ejecutar python con -u

Al igual que la opción # 2 anterior, esto hará que Python se ejecute “sin búfer” a lo largo de toda la vida de ejecución de su aplicación. Simplemente ejecute con python -u – no es necesario para la variable de entorno.

Si agrega la opción -u en la línea de ejecución del Dockerfile, se imprimirán sus registros:

 CMD ['python', '-u', 'my_python_script.py']