文字列入力を subprocess.Popen に渡す
StringIO オブジェクトを stdin として subprocess.Popen に渡そうとしているときにエラーが発生しました。オブジェクトは、サブプロセスによって有効なファイルのようなオブジェクトとして認識されません。この問題を解決し、文字列を標準入力として正常に渡すには、まず Popen プロセスへのパイプラインを作成する必要があります。
明示的なパイプライン作成の使用
サブプロセス。 communication()のドキュメントでは、プロセスのstdinにデータを送信するためにstdin=PIPEを指定してパイプラインを作成することを推奨しています。これは、コードを次のように変更することで実現できます。
import subprocess 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())
このコードは、grep プロセスへのパイプを作成し、入力文字列が stdin 引数を介して渡されるようにします。
subprocess.run の使用 (Python 3.5 )
Python バージョン 3.5 およびさらに、subprocess.run を使用すると、1 回の呼び出しで入力を文字列として渡し、出力を文字列として取得できます。
#!/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)
このアプローチは、明示的なパイプライン作成メソッドに代わる簡潔な代替手段となります。
以上が文字列を標準入力として subprocess.Popen に渡す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。