Python subprocess 模块,我如何为管道命令系列中的第一个提供输入? [英] Python subprocess module, how do I give input to the first of series of piped commands?

查看:27
本文介绍了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 模块,我如何为管道命令系列中的第一个提供输入?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆