进程运行时不断打印子流程输出为了从我的Python脚本启动程序,我使用了以下方法:def execute(command):
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = process.communicate()[0]
exitCode = process.returncode if (exitCode == 0):
return output else:
raise ProcessException(command, exitCode, output)所以当我启动一个进程Process.execute("mvn clean install"),我的程序等待进程完成,只有这样,我才能得到程序的完整输出。如果我正在运行一个需要一段时间才能完成的进程,这是很烦人的。我能让我的程序逐行地写进程输出,在流程输出完成之前轮询它吗?*[编辑]对不起,在发布这个问题之前,我搜索得不太好。线程实际上是关键。在这里找到一个例子,说明如何做到这一点:*从线程打开
3 回答

largeQ
TA贡献2039条经验 获得超7个赞
lines = iter(fd.readline, "")
from __future__ import print_function # Only Python 2.ximport subprocessdef execute(cmd): popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) for stdout_line in iter(popen.stdout.readline, ""): yield stdout_line popen.stdout.close() return_code = popen.wait() if return_code: raise subprocess.CalledProcessError(return_code, cmd)# Examplefor path in execute(["locate", "a"]): print(path, end="")

慕少森
TA贡献2019条经验 获得超9个赞
def execute(command): process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) # Poll process for new output until finished while True: nextline = process.stdout.readline() if nextline == '' and process.poll() is not None: break sys.stdout.write(nextline) sys.stdout.flush() output = process.communicate()[0] exitCode = process.returncode if (exitCode == 0): return output else: raise ProcessException(command, exitCode, output)

慕虎7371278
TA贡献1802条经验 获得超4个赞
from subprocess import Popen, PIPE, CalledProcessErrorwith Popen(cmd, stdout=PIPE, bufsize=1, universal_newlines=True) as p: for line in p.stdout: print(line, end='') # process line hereif p.returncode != 0: raise CalledProcessError(p.returncode, p.args)
p.poll()
iter(p.stdout.readline, '')
添加回答
举报
0/150
提交
取消