Python 2で文字列をsubprocess.Popenに渡すにはどうすればよいですか? [複製]

StackOverflow https://stackoverflow.com/questions/1421311

  •  07-07-2019
  •  | 
  •  

質問

    

この質問にはすでに回答があります:

         

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
>>>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top