l'impression python sur la sortie standard se perd en cas d'échec des tâches de cluster
Question
J'ai un code python que j'exécute sur un cluster d'ordinateurs.La sortie par défaut (stdout
, depuis print
) se perd lorsque le code échoue (ou est annulé, etc.).Il n'apparaît pas non plus dans le fichier de sortie lorsque je l'appelle immédiatement après l'appel de la partie correspondante du code.
La sortie d'erreur (stderr
) est cependant imprimé en cas d'échec du travail.Si je me souviens bien, en C++, vous pouvez flush
streams pour s'assurer que la sortie bloquée dans un tampon quelque part est réellement imprimée.Existe-t-il un analogue pour python ?Comment puis-je m'assurer d'obtenir ce résultat dès que possible ?
une représentation schématique de mon code
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()
Après quelques itérations, j'aurai de nombreux fichiers de sortie (depuis filename
), mais aucune sortie dans mon stdout
déposer.Si la fonction otherStuff()
devaient provoquer un crash (etc), sortie Volonté apparaître dans mon stderr
fichier - mais toujours rien dans mon stdout
déposer.
La solution
Bon alors print
va à sys.stdout qui est un objet fichier, pour lequel vous pouvez utiliser le flush()
commande.La bonne réponse est donc d'ajouter flush()
appelle en cas de besoin, c'est-à-dire
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()