代码是这样的:

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/

10-12 22:21