【发布时间】:2013-12-19 15:16:14
【问题描述】:
我在 Windows 上有一个程序,它调用一堆子进程,并在 GUI 中显示结果。我将 PyQt 用于 GUI,并使用 subprocess 模块来运行程序。
我有以下WorkerThread,它为每个 shell 命令生成一个子线程,专门用于读取进程 stdout 并打印结果(稍后我会将它连接到 GUI) .
这一切都有效。 除了proc.stdout.read(1)从不在子流程完成之前返回。这是一个大问题,因为其中一些子流程可能需要 15-20 分钟才能运行,而且我需要在它们运行时显示结果。
在子进程运行时我需要做什么才能使管道正常工作?
class WorkerThread(QtCore.QThread):
def run(self):
def sh(cmd, cwd = None):
proc = subprocess.Popen(cmd,
shell = True,
stdout = subprocess.PIPE,
stderr = subprocess.STDOUT,
stdin = subprocess.PIPE,
cwd = cwd,
env = os.environ)
proc.stdin.close()
class ReadStdOutThread(QtCore.QThread):
def run(_self):
s = ''
while True:
if self.request_exit: return
b = proc.stdout.read(1)
if b == '\n':
print s
s = ''
continue
if b:
s += b
continue
if s: print s
return
thread = ReadStdOutThread()
thread.start()
retcode = proc.wait()
if retcode:
raise subprocess.CalledProcessError(retcode, cmd)
return 0
FWIW:我使用QProcess 重写了整个内容,我看到了完全相同的问题。 stdout 不接收任何数据,直到底层进程返回。然后我一下子就搞定了。
【问题讨论】:
标签: python multithreading pyqt subprocess qthread