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 № 1Problem 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"]