ホームページ >バックエンド開発 >Python チュートリアル >stdin 経由で文字列を「subprocess.Popen」に正しく渡すにはどうすればよいですか?

stdin 経由で文字列を「subprocess.Popen」に正しく渡すにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-05 09:54:12558ブラウズ

How to Correctly Pass Strings to `subprocess.Popen` via stdin?

stdin 経由で subprocess.Popen に文字列を渡す

問題

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]

Error

Traceback は、cStringIO.StringIO と subprocess.Popen に必要な fileno() メソッドの非互換性を強調表示します。

AttributeError: 'cStringIO.StringI' object has no attribute 'fileno'

Solution

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 ソリューション

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。