2013-12-13 9 views
6

Mam program w języku Python, w którym mam niektóre instrukcje drukowania, a następnie wywołania niektórych plików wykonywalnych w języku C++, z których również uzyskuję niektóre dane wyjściowe na standardowe wyjście. Kiedy uruchomię ten skrypt Pythona w terminalu unix, otrzymam wynik na ekranie zgodnie z oczekiwaniami (w poprawnej kolejności tj. Najpierw z print a następnie z plików wykonywalnych C++). Problem polega na tym, że przekierowuję to wyjście do pliku takiego, jak:Przekierowanie stdout ze skryptu python w środowisku * nix nie działa poprawnie

Otrzymuję dane wyjściowe w niewłaściwej kolejności. Najpierw otrzymuję pliki wykonywalne C++, a potem drugie.

+1

Czy jesteś pewien, że wszystko jest zapisane na standardowe wyjście 'sys.stdout''? –

+0

Myślę, że to było do STDOUT ... Mam rozwiązanie teraz ... powinienem stdout z sys.stdout.flush() ... – zeeshan

Odpowiedz

2

Python używa buforowania linii, gdy stdout jest urządzeniem tty, stąd wynik jest zgodny z kolejnością poleceń drukowania. W przypadku przekierowania python buforuje wyjście instrukcji drukowania. Podczas gdy bufor wykonywalny C++ nie jest obsługiwany przez Pythona w obu przypadkach. Więc kiedy dane wyjściowe są przekierowywane, instrukcje drukowania są buforowane i nie są wysyłane do pliku, dopóki bufor się nie zapełni lub skończy się program.

sys.stdout.flush() spowoduje wypróżnienie wyników instrukcji drukowania, jak pokazano poniżej. Uwaga: należy wykonać instrukcje print

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

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

wyjściowa:

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

sys.stdout.flush() działa – zeeshan

0

Dzieje się tak dlatego, że bufor stdout i bufor stdout Pythona nie są zsynchronizowane.

Spróbuj wypróżnić standardowe wyjście po poleceniach drukowania i przed wykonaniem plików wykonywalnych w języku C++.

import sys 
sys.stdout.flush() 
+0

Tak, myślę, że to by działało. – zeeshan

+0

Działa ... dziękuje .. – zeeshan

5

można uruchomić Pythona z wyjściem niebuforowanym przy użyciu przełącznika wiersza polecenia -u, to można po prostu zadzwonić python -u myscript.py i wyjście na standardowe wyjście powinno być zsynchronizowane później.

Powiązane problemy