ホームページ  >  記事  >  バックエンド開発  >  Python でサブプロセスの出力をターミナルとファイルの両方に同時に書き込むにはどうすればよいですか?

Python でサブプロセスの出力をターミナルとファイルの両方に同時に書き込むにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-03 22:58:30740ブラウズ

How Can I Write Subprocess Output to Both the Terminal and Files Simultaneously in Python?

Python のサブプロセスと同時にプロセス出力をターミナルとファイルに書き込む

subprocess.call() を使用して複数の実行可能ファイルを実行する場合、出力はターミナルと指定されたファイルの両方に表示されます。ただし、デフォルトの動作では、ファイルまたは端末への出力リダイレクトのみが許可されます。

この制限を克服するには、Popen を stdout=PIPE 引数と直接組み合わせて使用​​することを検討してください。これにより、Popen オブジェクトの stdout 属性から出力を読み取ることができるようになります。

目的の動作を実現するには、次の手順を実行します。

  • Create a tee() function: この関数は、1 つのファイルから複数の出力ファイルに入力を転送するスレッドを生成します。
  • teed_call() 関数を実装します: この関数は subprocess.call() をエミュレートしますが、受け入れます追加の stdout および stderr ファイル引数。 tee() を使用して、ファイルと端末の両方に出力を書き込みます。

これらの関数の使用方法の例を次に示します。

<code class="python">import sys
from subprocess import Popen, PIPE
from threading import Thread

def tee(infile, *files):
    ...

def teed_call(cmd_args, **kwargs):
    ...

outf, errf = open("out.txt", "wb"), open("err.txt", "wb")
assert not teed_call(["cat", __file__], stdout=None, stderr=errf)
assert not teed_call(["echo", "abc"], stdout=outf, stderr=errf, bufsize=0)
assert teed_call(["gcc", "a b"], close_fds=True, stdout=outf, stderr=errf)</code>

このコードは、出力を両方に効果的に書き込みます。実行されたコマンドごとにファイルとターミナルを同時に実行します。

以上がPython でサブプロセスの出力をターミナルとファイルの両方に同時に書き込むにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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