我有一个Python GUI应用程序,它使用subprocess.Popen调用调用另一个Python脚本。我的GUI中有一个Tkinter文本框,我想在其中显示子进程的输出。在OS X上,这可以完美地工作,但在Windows 7上,输出不会显示在文本框中,直到子进程完成运行。如何在Windows上实时打印输出?
启动子流程的代码:
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()
将输出打印到文本框的功能。这是在一个单独的线程中运行的,这样在子进程执行时GUI不会挂起。
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()
答案 0 :(得分:1)
问题是在Windows上运行的Python将STDERR保存在缓冲区中,直到命令运行完毕(!?)。
解决方案是告诉Python在不使用-u
标志缓冲其输出的情况下运行。这使命令I传递给subprocess.Popen
["python", "-u", "myprogram.py"]
而不是
["python", "myprogram.py"]