3

を使用して 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

を使用しようとしまし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'

一時ファイルを作成してそこに文字列を書き込むこともできると思いますが、それもあまり良くありません。

4

2 に答える 2

8

文字列として通信するために文字列をフィードしようとしましたか?

Popen.communicate(input=my_input)

それはこのように動作します:

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

出力:

first

最初に試したときに stdin を subprocess.PIPE に設定するのを忘れていました。

于 2009-09-14T12:48:31.123 に答える
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
>>>
于 2009-09-14T12:57:31.277 に答える