/ / Python script nie może odczytać danych wyjściowych Popen dopóki proces nie zostanie zakończony (w systemie Windows) - python, windows, python-2.7, tkinter, subprocess

Skrypt w języku Python nie może odczytać danych wyjściowych Popen aż do zakończenia procesu (w systemie Windows) - python, windows, python-2.7, tkinter, subprocess

Mam aplikację GUI Python, która wywołujeinny skrypt w języku Python za pomocą wywołania subprocess.Popen. Mam pole tekstowe Tkinter w moim GUI, w którym chciałbym wyświetlić wynik podprocesu. W systemie OS X działa to bezbłędnie, ale w systemie Windows 7 dane wyjściowe nie są wyświetlane w polu tekstowym, dopóki nie zostanie uruchomiony podproces. Jak mogę wydrukować dane wyjściowe w czasie rzeczywistym w systemie Windows?

Kod, aby uruchomić podproces:

p = Popen(command, stdout=PIPE, stderr=STDOUT, bufsize=1, close_fds=ON_POSIX)
t = Thread(target=read_and_print, args=(p, log_output))
t.daemon = True
t.start()

Funkcja drukowania wyników w polu tekstowym. Jest uruchamiany w osobnym wątku, aby GUI nie zawiesił się podczas wykonywania podprocesu.

def read_and_print(process, textarea):
out = process.stdout

for line in iter(out.readline, b""):
textarea.insert(END, line)
textarea.see(END)
#this triggers an update of the text area, otherwise it doesn"t update
textarea.update_idletasks()

Odpowiedzi:

1 dla odpowiedzi № 1

Problem polegał na tym, że Python działający w systemie Windows trzymał STDERR w buforze, dopóki polecenie się nie zakończyło (!?).

Rozwiązaniem jest przekazanie Pythonowi, aby działał bez buforowania jego wyjścia za pomocą -u flaga. To sprawia, że ​​polecenie I przechodzi do subprocess.Popen

["python", "-u", "myprogram.py"]

zamiast

["python", "myprogram.py"]