我想用Python运行一个进程(2.4/2.5/2.6)Popen
,我想给它一个字符串作为它的标准输入.
我将编写一个示例,其中进程执行"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
Run Code Online (Sandbox Code Playgroud)
我尝试使用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'
Run Code Online (Sandbox Code Playgroud)
我想我可以制作一个临时文件并在那里写字符串 - 但这也不是很好.
您是否尝试过将字符串作为字符串进行通信?
Popen.communicate(input=my_input)
Run Code Online (Sandbox Code Playgroud)
它的工作原理如下:
p = subprocess.Popen(["head", "-n", "1"], stdin=subprocess.PIPE)
p.communicate('first\nsecond')
Run Code Online (Sandbox Code Playgroud)
输出:
first
Run Code Online (Sandbox Code Playgroud)
当我第一次尝试时,我忘了将stdin设置为subprocess.PIPE.
使用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
>>>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4717 次 |
最近记录: |