ホームページ >バックエンド開発 >Python チュートリアル >文字列を subprocess.Popen の stdin にパイプするにはどうすればよいですか?
Stdin 引数を介して文字列を subprocess.Popen にパイプする方法
subprocess.Popen 関数を使用すると、Python スクリプトで新しいプロセスを生成し、標準入力、出力、エラーと対話します。一般的な使用例の 1 つは、stdin 経由で子プロセスにデータを渡すことです。これは、オブジェクトの作成時に stdin=PIPE を指定することで実現できます。
ただし、cStringIO.StringIO オブジェクトを stdin ストリームとして使用しようとすると、次のような結果が得られます。 subprocess.Popen が期待する fileno 属性が欠如しているため、エラーになります。この問題を解決するには、次のテクニックを利用します。
Popen.communicate() の使用
公式ドキュメントによると、Popen.communicate() はデータが渡されることを期待しています。標準入力ストリームではなく、入力パラメータを通じて。コードを次のように変更します。
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())
subprocess.run の使用 (Python 3.5 )
Python バージョン 3.5 以降の場合、subprocess.run は簡単な管理方法を提供します。サブプロセス。これにより、単一の関数呼び出しで文字列入力を渡し、文字列出力を取得できるようになります。
#!/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) print(p.stdout)
これらのアプローチを採用すると、stdin 引数を介して文字列を subprocess.Popen に効果的に渡すことができ、プログラムで次のことが可能になります。外部プロセスとシームレスに対話します。
以上が文字列を subprocess.Popen の stdin にパイプするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。