2013-01-15 1 views
2

Le problème est illustré par ce script simple:ligne-tampon de sortie standard échoue sur MINGW/MSYS Python 2.7.3

import time, os, sys 
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 1) # line-buffer stdout 
print 'before sleep' 
time.sleep(10) 
print 'after sleep' 

Si la ligne-tampon est réussie, alors il y aura un écart de 10 secondes entre l'impression des deux lignes. Si ce n'est pas le cas, les deux lignes apparaîtront virtuellement en même temps après une pause de 10 secondes (une fois Python démarré); c'est-à-dire que les lignes sont imprimées à la sortie du programme.

Sous Linux, je vois un comportement de ligne-buffered à la fois à un fichier et à l'écran si la ligne "sys.stdout" est incluse. Sans cette ligne, je vois le comportement de la ligne-buffered à l'écran, mais pas à un dossier. C'est prévu.

Dans l'environnement MSYS/MINGW, si j'omets la ligne "sys.stdout", je vois le même comportement que Linux: mise en mémoire tampon à l'écran mais pas à un fichier.

Ce qui est bizarre est que avec la ligne « sys.stdout », je ne vois pas la ligne-tampon pour soit l'écran ou un fichier. Je m'attends à le voir à la fois, comme dans Linux.

Quelqu'un peut-il suggérer une solution de contournement?

est ici un peu plus d'informations:

uname -a MINGW32_NT-6.0 FOO 1.0.11 (0,46/3/2) 2009-05-23 19:33 i686 Msys

Merci, -W.

Répondre

2

Un de mes collègues connaissait la réponse.

La mise en mémoire tampon de ligne n'est pas prise en charge sur WIN32. Si la mise en mémoire tampon de ligne est spécifiée, elle revient à la mise en mémoire tampon complète. La sortie sans tampon est disponible et la solution consiste à l'utiliser sur WIN32. Je l'ai essayé dans mon programme de test simple, et cela fonctionne.

Réf .: http://msdn.microsoft.com/en-us/library/86cebhfs%28v=vs.71%29.aspx

Questions connexes