Python imprime en stdout y se pierde en trabajos de clúster fallidos
Pregunta
Tengo un código Python que estoy ejecutando en un grupo de computadoras.La salida predeterminada (stdout
, de print
) se pierde cuando el código falla (o se cancela, etc.).Tampoco aparece en el archivo de salida cuando lo llamo inmediatamente después de llamar a la parte correspondiente del código.
La salida de error (stderr
) sin embargo, se imprime cuando el trabajo falla.Si no recuerdo mal, en c++ puedes flush
secuencias para asegurarse de que la salida atrapada en un búfer en algún lugar realmente se imprima.¿Existe un análogo para Python?¿Cómo puedo asegurarme de obtener este resultado lo antes posible?
una representación esquemática de mi código
for it in somerange:
print "Iteration", it # This appears much later in stdout
f = open(filename[it], 'w')
f.write('stuff')
f.close # file appears when it is closed
otherStuff()
Después de algunas iteraciones, tendré numerosos archivos de salida (de filename
), pero no hay salida en mi stdout
archivo.Si la función otherStuff()
fueran a causar un bloqueo (etc.), salida Voluntad aparecer en mi stderr
archivo - pero aún no hay nada en mi stdout
archivo.
Solución
Bueno entonces print
va a sistema.stdout el cual es un objeto de archivo, para lo cual puedes utilizar el flush()
dominio.Entonces la respuesta correcta es agregar flush()
llama cuando es necesario, es decir
import sys
...
for it in somerange:
print "Iteration", it # This appears much later in stdout
sys.stdout.flush()
f = open(filename[it], 'w')
f.write('stuff')
f.close # file appears when it is closed
otherStuff()