36

スクリプトを呼び出して、文字列の内容を標準入力にパイプし、標準出力を取得したいと考えています。

実際のファイルシステムに触れたくないので、実際の一時ファイルを作成できません。

を使用するsubprocess.check_outputと、スクリプトが記述したものは何でも取得できます。ただし、入力文字列を標準入力に入れるにはどうすればよいですか?

subprocess.check_output([script_name,"-"],stdin="this is some input")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 537, in check_output
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
  File "/usr/lib/python2.7/subprocess.py", line 672, in __init__
    errread, errwrite) = self._get_handles(stdin, stdout, stderr)
  File "/usr/lib/python2.7/subprocess.py", line 1043, in _get_handles
    p2cread = stdin.fileno()
AttributeError: 'str' object has no attribute 'fileno'
4

3 に答える 3

36

Popen.communicateの代わりに使用してくださいsubprocess.check_output

from subprocess import Popen, PIPE

p = Popen([script_name, "-"], stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate("this is some input")
于 2012-04-11T09:58:08.170 に答える
26

Python 3.4 以降では、inputキーワード パラメータを使用して、使用時に STDIN 経由で入力を送信できます。subprocess.check_output()

の標準ライブラリ ドキュメントsubprocess.check_output()からの引用:

入力引数は、Popen.communicate()サブプロセスの標準入力に渡されます。使用する場合は、バイト シーケンスにする必要があります universal_newlines=True。. 使用すると、内部Popenオブジェクトが で自動的に作成されstdin=PIPEstdin引数も使用されない場合があります。

例:

>>> subprocess.check_output(["sed", "-e", "s/foo/bar/"],
...                         input=b"when in the course of fooman events\n")
b'when in the course of barman events\n'
>>> 
>>> # To send and receive strings instead of bytes,
>>> # pass in universal_newlines=True
>>> subprocess.check_output(["sed", "-e", "s/foo/bar/"],
...                         universal_newlines=True,
...                         input="when in the course of fooman events\n")
'when in the course of barman events\n'
于 2014-08-28T05:54:25.433 に答える