stdin に subprocess.Popen で StringIO を利用しようとすると、 AttributeError.
import subprocess from cStringIO import StringIO subprocess.Popen(['grep', 'f'], stdout=subprocess.PIPE, stdin=StringIO('one\ntwo\nthree\nfour\nfive\nsix\n')).communicate()[0]
Traceback は、cStringIO.StringIO と subprocess.Popen に必要な fileno() メソッドの非互換性を強調表示します。
AttributeError: 'cStringIO.StringI' object has no attribute 'fileno'
subprocess.Popen ドキュメントでは stdin=PIPE を使用する必要があります標準入力へのデータ送信用。 os.popen() 置換構文が推奨されます:
pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
元のコードの適応:
from subprocess import Popen, PIPE, STDOUT p = Popen(['grep', 'f'], stdout=PIPE, stdin=PIPE, stderr=STDOUT) grep_stdout = p.communicate(input=b'one\ntwo\nthree\nfour\nfive\nsix\n')[0] print(grep_stdout.decode()) # -> four # -> five # ->
Python 3.5 の場合:
#!/usr/bin/env python3 from subprocess import run, PIPE p = run(['grep', 'f'], stdout=PIPE, input='one\ntwo\nthree\nfour\nfive\nsix\n', encoding='ascii') print(p.returncode) # -> 0 print(p.stdout) # -> four # -> five # ->
以上がstdin 経由で文字列を「subprocess.Popen」に正しく渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。