ホームページ > バックエンド開発 > Python チュートリアル > 文字列を subprocess.Popen の stdin にパイプするにはどうすればよいですか?

文字列を subprocess.Popen の stdin にパイプするにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-08 18:31:10
オリジナル
507 人が閲覧しました

How Can I Pipe a String to subprocess.Popen's 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート