wyjście na żywo z polecenia subprocess
Używam skryptu Pythona jako sterownika kodu hydrodynamicznego. Kiedy przychodzi czas na uruchomienie symulacji, używamsubprocess.Popen
aby uruchomić kod, zbierz dane wyjściowe z stdout i stderr do asubprocess.PIPE
--- wtedy mogę wydrukować (i zapisać do pliku dziennika) informacje wyjściowe i sprawdzić, czy nie ma błędów. Problem polega na tym, że nie mam pojęcia, jak postępuje kod. Jeśli uruchomię go bezpośrednio z wiersza poleceń, daje mi dane wyjściowe o tym, jaka jest jego iteracja, o której godzinie, jaki jest następny krok czasu itd.
Czy istnieje sposób zarówno na zapisanie danych wyjściowych (do rejestrowania i sprawdzania błędów), jak i na wyjście strumieniowe na żywo?
Odpowiednia sekcja mojego kodu:
ret_val = subprocess.Popen( run_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True )
output, errors = ret_val.communicate()
log_file.write(output)
print output
if( ret_val.returncode ):
print "RUN failed\n\n%s\n\n" % (errors)
success = False
if( errors ): log_file.write("\n\n%s\n\n" % errors)
Oryginalnie byłam w rurociągurun_command
przeztee
tak, żeby kopia trafiła bezpośrednio do pliku dziennika, a strumień nadal był wysyłany bezpośrednio do terminala - ale w ten sposób nie mogę przechowywać żadnych błędów (do mojej wiedzy).
Edytować:
Tymczasowe rozwiązanie:
ret_val = subprocess.Popen( run_command, stdout=log_file, stderr=subprocess.PIPE, shell=True )
while not ret_val.poll():
log_file.flush()
następnie w innym terminalu uruchomtail -f log.txt
(s.t.log_file = 'log.txt'
).