gpt4 book ai didi

Python 子进程模块,如何为一系列管道命令中的第一个提供输入?

转载 作者:太空狗 更新时间:2023-10-30 00:46:45 24 4
gpt4 key购买 nike

我正在尝试使用 Python 的子进程模块。我需要的是将输入发送到第一个进程,其输出成为第二个进程的输入。情况基本上与此处文档中给出的示例几乎相同: http://docs.python.org/library/subprocess.html#replacing-shell-pipeline除了我需要在第一个命令中提供输入。这是复制的示例:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

如果我们将第一行更改为:

p1 = Popen(["cat"], stdout=PIPE, stdin=PIPE)

如何向进程提供输入字符串?如果我尝试将最后一行更改为:

output = p2.communicate(input=inputstring)[0]

这行不通。

我有一个工作版本,它只是将第一个命令的输出存储在一个字符串中,然后将其传递给第二个命令。这并不可怕,因为基本上没有可以利用的并发性(在我的实际用例中,第一个命令将很快退出并在最后产生所有输出)。这是完整的工作版本:

import subprocess

simple = """Writing some text
with some lines in which the
word line occurs but others
where it does
not
"""

def run ():
catcommand = [ "cat" ]
catprocess = subprocess.Popen(catcommand,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
(catout, caterr) = catprocess.communicate(input=simple)
grepcommand = [ "grep", "line" ]
grepprocess = subprocess.Popen(grepcommand,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
(grepout, greperr) = grepprocess.communicate(input=catout)
print "--- output ----"
print grepout
print "--- error ----"
print greperr

if __name__ == "__main__":
run()

我希望我已经足够清楚了,感谢您的帮助。

最佳答案

如果你这样做

from subprocess import Popen, PIPE
p1 = Popen(["cat"], stdout=PIPE, stdin=PIPE)

您应该执行 p1.communicate("Your Input to the p1") 并且它将流经 PIPE。stdin 是进程的输入,您应该只与它通信。

给出的程序完全没问题,好像没有问题。

关于Python 子进程模块,如何为一系列管道命令中的第一个提供输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5080402/

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