如何在 Python 2 中将字符串传递给 subprocess.Popen? [复制]
Posted
技术标签:
【中文标题】如何在 Python 2 中将字符串传递给 subprocess.Popen? [复制]【英文标题】:How do I pass a string into subprocess.Popen in Python 2? [duplicate] 【发布时间】:2010-11-28 02:58:14 【问题描述】:我想使用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'
我想我可以创建一个临时文件并在那里写入字符串——但这也不是很好。
【问题讨论】:
这是同一个问题,但这个问题是关于 Python 2 的,其中答案与 Python 3 略有不同(您不需要输入字符串前面的“b”并且不要'不需要解码结果)。 【参考方案1】:您是否尝试将您的字符串作为字符串提供给communicate?
Popen.communicate(input=my_input)
它是这样工作的:
p = subprocess.Popen(["head", "-n", "1"], stdin=subprocess.PIPE)
p.communicate('first\nsecond')
输出:
first
第一次尝试时忘记将 stdin 设置为 subprocess.PIPE。
【讨论】:
+1 我只是在撰写一个暗示同样事情的答案的过程中。 同上 mikej :) 我发布并刚刚删除【参考方案2】:使用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
>>>
【讨论】:
+1,我建议交流,但没有用。您的解决方案有效。 我试用了您的“沟通”解决方案,它奏效了!其实,我更喜欢它,我只是在它被删除时接受它。你能把它放回去吗? 请注意,正如我刚刚发现的那样,这仅限于一次最多发送 64kB。以上是关于如何在 Python 2 中将字符串传递给 subprocess.Popen? [复制]的主要内容,如果未能解决你的问题,请参考以下文章