我正在学习python,需要一些帮助。下面的代码执行4个子进程命令。每个命令一个接一个地执行,所有的输出和错误都会显示出来。如何保留等待和显示所有输出的行为,但同时执行多个命令?我看过running several system commands in parallel,它看起来和我想要的差不多,但是我不确定如何让它工作,并将每个进程的输出保存到标准输出。
def execute(command):
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while True:
nextline = process.stdout.readline()
if nextline == '' and process.poll() != None:
break
sys.stdout.write(nextline)
sys.stdout.flush()
output = process.communicate()[0]
returncode = process.returncode
if (returncode == 0):
return output
else:
raise Exception("%s %s %s" % (command, returncode, output))
execute(cmd1)
execute(cmd2)
execute(cmd3)
execute(cmd4)
发布于 2015-07-02 15:53:01
在我看来,由于这一部分,您的函数可能正在等待:
while True:
nextline = process.stdout.readline()
if nextline == '' and process.poll() != None:
break
sys.stdout.write(nextline)
sys.stdout.flush()
output = process.communicate()[0]
在对第一个命令调用communicate()之前,应该对所有命令调用Popen()。
例如:
a = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True)
b = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True)
c = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True)
# wait for them to finish
astdout, astderr = a.communicate()
bstdout, bstderr = b.communicate()
cstdout, cstderr = c.communicate()
print astdout
print bstdout
print cstdout
https://stackoverflow.com/questions/30783553
复制