如何在Python 2中将字符串传递给subprocess.Popen?

时间:2009-09-14 12:41:43

标签: python popen

我想使用Popen和我在Python(2.4 / 2.5 / 2.6)中运行一个进程 我想给它一个字符串作为标准输入。

我将编写一个示例,其中进程执行“head -n 1”输入。

以下作品,但我想以更好的方式解决它,而不使用 echo

>>> from subprocess import *
>>> p1 = Popen(["echo", "first line\nsecond line"], stdout=PIPE)
>>> Popen(["head", "-n", "1"], stdin=p1.stdout)
first line

我尝试使用StringIO,但它不起作用:

>>> from StringIO import StringIO
>>> Popen(["head", "-n", "1"], stdin=StringIO("first line\nsecond line"))
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/usr/lib/python2.4/subprocess.py", line 533, in __init__
    (p2cread, p2cwrite,
  File "/usr/lib/python2.4/subprocess.py", line 830, in _get_handles
    p2cread = stdin.fileno()
AttributeError: StringIO instance has no attribute 'fileno'

我想我可以制作一个临时文件并在那里写字符串 - 但这也不是很好。

2 个答案:

答案 0 :(得分:8)

您是否尝试将字符串作为字符串提供给communicate

Popen.communicate(input=my_input)

它的工作原理如下:

p = subprocess.Popen(["head", "-n", "1"], stdin=subprocess.PIPE)
p.communicate('first\nsecond')

输出:

first

我忘了在第一次尝试时将stdin设置为subprocess.PIPE。

答案 1 :(得分:5)

使用os.pipe

>>> from subprocess import Popen
>>> import os, sys
>>> read, write = os.pipe()
>>> p = Popen(["head", "-n", "1"], stdin=read, stdout=sys.stdout)
>>> byteswritten = os.write(write, "foo bar\n")
foo bar
>>>