gpt4 book ai didi

python - 如何在 Python 中重用 Popen 的中间结果?

转载 作者:太空狗 更新时间:2023-10-29 11:09:55 25 4
gpt4 key购买 nike

代码是这样的:

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 被执行了三次,因为当我使用一次 commnnicate 时,那个 Popen 对象的 stdout无法再次使用。我只是想知道是否有一种方法可以重用 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 block 中抛出了一些 io 异常。 cmd1 运行一次并输出到临时文件,调用 wait() 方法以确保所有执行已完成,然后我们每次执行 seek(0) 这样当我们调用 f 上的 read() 方法时它又回来了在文件的开头。作为引用问题Saving stdout from subprocess.Popen to file ,帮助我获得了解决方案的第一部分。

关于python - 如何在 Python 中重用 Popen 的中间结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13505395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com