5

Python を使用して、いくつかのシェル スクリプト、RScript、Python プログラムなどを実行しています。これらのプログラムは長時間実行される可能性があり、多くの (ログ) 情報を stdout および stderr に出力する可能性があります。私は正常に動作する次の(Python 2.6)コードを使用しています:

stdoutFile=open('stdout.txt', 'a')
stderrFile=open('stderr.txt', 'a')
subprocess.call(SHELL_COMMAND, shell=True, stdout=stdoutFile, stderr=stderrFile)
stdoutFile.close()
stderrFile.close()

これは主に、ファイルに送信される情報のログ記録であり、この情報は長期間にわたって生成される可能性があります。したがって、各行に日付と時刻のプレフィックスを付けることができるかどうか疑問に思っていましたか?

たとえば、現在ログに記録する場合:

Started
Part A done
Part B done
Finished

それから私はそれが欲しい:

[2012-12-18 10:44:23] Started
[2012-12-18 12:26:23] Part A done
[2012-12-18 14:01:56] Part B done
[2012-12-18 22:59:01] Finished

注:私が実行するプログラムを変更することは、このpythonコードがこれらのプログラムのラッパーのようなものであるため、オプションではありません。

4

1 に答える 1

5

stdoutのおよびstderr引数にファイルを提供する代わりにsubprocess.call()Popenオブジェクトを直接作成して を作成PIPEし、このマネージャー スクリプトでこれらのパイプを読み取り、必要なログ ファイルに書き込む前に必要なタグを追加します。

def flush_streams_to_logs(proc, stdout_log, stderr_log):
    pipe_data = proc.communicate()
    for data, log in zip(pipe_data, (stdout_log, stderr_log)):
        # Add whatever extra text you want on each logged message here
        log.write(str(data) + '\n')

with open('stdout.txt', 'a') as stdout_log, open('stderr.txt', 'a') as stderr_log:
    proc = subprocess.Popen(SHELL_COMMAND, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    while proc.returncode is None:
        flush_streams_to_logs(proc, stdout_log, stderr_log)
    flush_streams_to_logs(proc, stdout_log, stderr_log)

communicate()サブプロセスが終了するまでブロックすることに注意してください。サブプロセスのストリームを直接使用して、よりリアルタイムのログを取得することもできますが、同時実行性とバッファー フィル状態を自分で処理する必要があります。

于 2012-12-18T14:27:01.680 に答える