我在Windows系统上有一个程序,它会调用许多子进程,并在GUI中显示结果。我使用PyQt来创建GUI,使用subprocess模块运行程序。
我有以下WorkerThread函数,为每个shell命令生成一个子线程来读取进程的stdout并打印结果(稍后将其连接到GUI)。
这一切都有效。但是,proc.stdout.read(1)直到子进程完成之后才会返回。这是一个大问题,因为其中一些子过程可能需要15-20分钟才能运行,而我需要实时显示结果。
我需要做什么才能在子进程运行时使管道正常工作?
我有以下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
值得一提的是:我使用QProcess
重写了整个过程,但是我遇到了同样的问题。在底层进程返回之前,stdout
接收不到任何数据,然后我才会一次性收到所有东西。