Python 2で文字列をsubprocess.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'
一時ファイルを作成してそこに文字列を書き込むことができたと思いますが、どちらもあまり良くありません。
解決
文字列を communicate に次のようにフィードしようとしましたか?文字列?
Popen.communicate(input=my_input)
次のように機能します:
p = subprocess.Popen(["head", "-n", "1"], stdin=subprocess.PIPE)
p.communicate('first\nsecond')
出力:
first
最初に試したときに、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
>>>
所属していません StackOverflow