30

私はPythonでラッパーを書いているコマンドラインツール(実際にはいくつか)を持っています。

このツールは通常、次のように使用されます。

 $ path_to_tool -option1 -option2 > file_out

ユーザーは file_out に書き込まれた出力を取得し、実行中のツールのさまざまなステータス メッセージを確認することもできます。

stderr (ステータス メッセージ) をファイルに記録しながら、この動作を再現したいと考えています。

私が持っているのはこれです:

from subprocess import call
call(['path_to_tool','-option1','option2'], stdout = file_out, stderr = log_file)

stderr が画面に書き込まれないことを除けば、これは問題なく動作します。もちろん、log_file の内容を画面に出力するコードを追加することもできますが、その場合、ユーザーはそれが発生している間ではなく、すべてが完了した後に表示されます。

要約すると、望ましい動作は次のとおりです。

  1. call() または subprocess() を使用する
  2. stdout をファイルに直接出力する
  3. ツールがコマンドラインから直接呼び出されたかのように、stderr をファイルに直接出力すると同時に、stderr をリアルタイムで画面に書き込みます。

本当に単純なものが欠けているか、これは思ったよりもはるかに複雑だと感じています...助けてくれてありがとう!

編集: これは Linux でのみ機能する必要があります。

4

3 に答える 3

1

あなたが探しているのは次のようなものだと思います:

import sys, subprocess
p = subprocess.Popen(cmdline,
                     stdout=sys.stdout,
                     stderr=sys.stderr)

出力/ログをファイルに書き込むにはcmdline、普通の Linux bash/shell で行うように、通常のリダイレクトを含めるように my を変更します。たとえばtee、コマンドラインに次のように追加します。cmdline += ' | tee -a logfile.txt'

それが役立つことを願っています。

于 2016-09-11T12:20:34.940 に答える