Python subprocess module, how do I give input to the first of series of piped commands?(Python subprocess 模块,我如何为管道命令系列中的第一个提供输入?)
问题描述
我正在尝试使用 Python 的 subprocess 模块.我需要的是将输入发送到第一个进程,其输出成为第二个进程的输入.情况与此处文档中给出的示例基本相同:http://docs.python.org/library/subprocess.html#replacing-shell管道除了我需要提供输入第一个命令.这是复制的示例:
I am trying to use Python's subprocess module. What I require is to send input to the first process whose output becomes the input of the second process. The situation is basically almost the same as the example given in the documentation here: http://docs.python.org/library/subprocess.html#replacing-shell-pipeline except that I need to provide input the first command. Here is that example copied:
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]
如果我们将第一行改为:
If we change the first line to:
p1 = Popen(["cat"], stdout=PIPE, stdin=PIPE)
如何向进程提供输入字符串?如果我尝试通过将最后一行更改为:
How do I provide the input string to the process? If I attempt it by changing the final line to:
output = p2.communicate(input=inputstring)[0]
这不起作用.
我确实有一个工作版本,它只是将第一个命令的输出存储在一个字符串中,然后将其传递给第二个命令.这并不可怕,因为基本上没有可以利用的并发性(在我的实际用例中,第一个命令将很快退出并在最后产生所有输出).这是完整的工作版本:
I do have a working version, which just stores the output of the first command in a string and then passes that to the second command. This isn't terrible as there is essentially no concurrency that can be exploited (in my actual use case the first command will exit rather quickly and produce all of its output at the end). Here is the working version in full:
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()
我希望我已经足够清楚了,感谢您的帮助.
I hope I've been clear enough, thanks for any help.
推荐答案
如果你这样做了
from subprocess import Popen, PIPE
p1 = Popen(["cat"], stdout=PIPE, stdin=PIPE)
您应该执行 p1.communicate("Your Input to the p1")
,这将流经 PIPE.标准输入是进程的输入,您应该只与它通信.
You should do p1.communicate("Your Input to the p1")
and that will flow through the PIPE.
The stdin is the process's input and you should communicate to that only.
给出的程序完全没问题,好像没有问题.
The program which have given is absolutely fine, there seems no problem with that.
这篇关于Python subprocess 模块,我如何为管道命令系列中的第一个提供输入?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Python subprocess 模块,我如何为管道命令系列中的第一个提供输入?
基础教程推荐
- 线程时出现 msgbox 错误,GUI 块 2022-01-01
- Dask.array.套用_沿_轴:由于额外的元素([1]),使用dask.array的每一行作为另一个函数的输入失败 2022-01-01
- 如何在海运重新绘制中自定义标题和y标签 2022-01-01
- 用于分类数据的跳跃记号标签 2022-01-01
- 何时使用 os.name、sys.platform 或 platform.system? 2022-01-01
- 在 Python 中,如果我在一个“with"中返回.块,文件还会关闭吗? 2022-01-01
- 筛选NumPy数组 2022-01-01
- 如何让 python 脚本监听来自另一个脚本的输入 2022-01-01
- Python kivy 入口点 inflateRest2 无法定位 libpng16-16.dll 2022-01-01
- 使用PyInstaller后在Windows中打开可执行文件时出错 2022-01-01