代码是这样的:
from subprocess import Popen, PIPE
p1 = Popen("command1", stdout = PIPE)
p2 = Popen("command2", stdin = p1.stdout, stdout = PIPE)
result_a = p2.communicate()[0]
p1_again = Popen("command1", stdout = PIPE)
p3 = Popen("command3", stdin = p1_again.stdout, stdout = PIPE)
result_b = p3.communicate()[0]
with open("test") as tf:
p1_again_again = Popen("command1", stdout = tf)
p1_again_again.communicate()
不好的部分是:
command1
执行了 3 次,因为当我使用 commnnicate
一次时,该 stdout
对象的 Popen
不能再次使用。我只是想知道是否有一种方法可以重用 PIPE
的中间结果。有没有人知道如何使这些代码更好(更好的性能以及更少的代码行)?谢谢!
最佳答案
这是一个有效的解决方案。我已经为 cmd1、cmd2、cmd3 放置了示例命令,以便您可以运行它。它只获取第一个命令的输出,并在一个命令中将其大写,在另一个命令中将其小写。
代码
from subprocess import Popen, PIPE, check_output
from tempfile import TemporaryFile
cmd1 = ['echo', 'Hi']
cmd2 = ['tr', '[:lower:]', '[:upper:]']
cmd3 = ['tr', '[:upper:]', '[:lower:]']
with TemporaryFile() as f:
p = Popen(cmd1, stdout=f)
ret_code = p.wait()
f.flush()
f.seek(0)
out2 = Popen(cmd2, stdin=f, stdout=PIPE).stdout.read()
f.seek(0)
out3 = Popen(cmd3, stdin=f, stdout=PIPE).stdout.read()
print out2, out3
输出
HI
hi
解决方案中需要注意的一些事项。当需要处理临时文件时,tempfile 模块总是一个很好的方法,一旦 with 语句退出,它会自动删除临时文件作为清理,即使在 with 块中抛出了一些 io 异常。 cmd1 运行一次并输出到临时文件,调用wait() 方法以确保所有执行都已完成,然后我们每次都执行seek(0) 以便当我们在f 上调用read() 方法时它又回来了在文件的开头。作为引用问题 Saving stdout from subprocess.Popen to file ,帮助我获得了解决方案的第一部分。
关于python - 如何在 Python 中重用 Popen 的中间结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13505395/