2013-12-13 18 views
6

Ho un programma Python in cui ho alcune istruzioni Print, seguite da chiamate ad alcuni eseguibili C++ da cui ottengo anche un output sullo stdout. Quando eseguo questo script python su un terminale unix, ottengo l'output sullo schermo come previsto (nell'ordine corretto, vale a dire prima dalla stampa e poi dagli eseguibili C++). Il problema è quando reindirizzo questa uscita a un file comeIl reindirizzamento dello stdout da uno script python chiamato in ambiente * nix non funziona correttamente

python test.py > out.txt 

Ottengo l'output nell'ordine errato. Ottengo prima l'output degli eseguibili C++ e poi l'altro.

+1

Sei sicuro che tutto è in fase di scrittura STDOUT '' sys.stdout''? –

+0

Penso che andasse allo STDOUT ... Ho ottenuto la soluzione ora ... dovrei lo stdout con sys.stdout.flush() ... – zeeshan

risposta

2

Python utilizza il buffering di riga quando stdout è un dispositivo tty, quindi l'output è secondo l'ordine delle istruzioni di stampa. In caso di reindirizzamento dei buffer Python, l'output delle istruzioni di stampa. Mentre il buffering dell'output eseguibile C++ non è gestito da python in entrambi i casi. Quindi, quando l'output viene reindirizzato, le istruzioni di stampa vengono bufferizzate e non vengono inviate al file fino a quando il buffer non è pieno o il programma termina.

sys.stdout.flush() scaricherà l'output delle istruzioni di stampa come di seguito. Nota dovrebbe seguire le istruzioni di stampa

#!/usr/local/bin/python 
import os 
import sys 

print("Hello1") 
print("Hello2") 
sys.stdout.flush() 
os.system("/python/cppprog.o") 
print("Bye1") 
print("Bye2") 

uscita:

]# python script.py > o.txt 
]# cat o.txt 
Hello1 
Hello2 
Hello, world! 
Bye1 
Bye2 
+0

sys.stdout.flush() funziona – zeeshan

0

Questo perché il buffer stdout di python e il buffer stdout di os non sono sincronizzati.

Provare a scaricare lo stdout dopo le dichiarazioni di stampa e prima di eseguire gli eseguibili C++.

import sys 
sys.stdout.flush() 
+0

Sì, penso che funzionerebbe. – zeeshan

+0

Funziona ... grazie .. – zeeshan

5

È possibile eseguire python con uscita senza buffer utilizzando la riga di comando -u, vale a dire si può chiamare python -u myscript.py e l'uscita a stdout dovrebbe essere sincronizzato da allora in poi.