如何在 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? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在Python中将变量传递给bash命令

如何在plsql中将字符串数据类型传递给数字数据类型

如何在 Python 中将日期传递给 MySQLdb?

如何在 SWIG/Python 中将结构列表传递给 C

如何在 Entity Framework Core 中将连接字符串传递给 DBContext?

如何在 mongodb 聚合中将动态字符串传递给 $regex