在脚本完成之前,Python脚本无法读取Popen输出(在Windows上)

时间:2014-12-11 21:29:37

标签: python windows python-2.7 tkinter subprocess

我有一个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()

1 个答案:

答案 0 :(得分:1)

问题是在Windows上运行的Python将STDERR保存在缓冲区中,直到命令运行完毕(!?)。

解决方案是告诉Python在不使用-u标志缓冲其输出的情况下运行。这使命令I传递给subprocess.Popen

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

而不是

["python", "myprogram.py"]