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.

Était-ce utile?

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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top