0

他の多くのスクリプトを実行する python スクリプトを作成しようとしています。スクリプトを実行すると、そのスクリプトの出力が画面に表示されるようにしたいのですが、終了ステータスが悪い場合は、出力を取得してログ ファイルに追加します。「コマンド」インターフェイスを使用しようとしましたが、これでは、ファイルに追加するデータを保持している標準出力を表示することはできません。私はpython 2.2を使用していることに注意してください(はい、古いですが、与えられたもので作業する必要があります)。

ありがとうございました。

サンプルコード:(私が望むことはしません)

def run_functional_analysis(script, now):
    stat, output = commands.getstatusoutput(script_dir + script + " -fb")
    if stat!=0: #If the script failed:
        os.system("echo \"[" + now + "] - " + output + "\" >> " + LOG_DIR + script + ".log")
4

1 に答える 1

2

Python 2.2 はかなり古いです。subprocessは とよりもはるかに優れているため、可能であればアップグレードする必要がos.systemありos.popenます。

必要なのは、文字列への書き込みとstdout文字列へのキャプチャの両方を行うファイルのようなオブジェクトです (おそらく を使用します。その後、呼び出しでそのオブジェクトをおよびStringIO)として指定できます。stdoutstderrsubprocess

import sys, subprocess
from cStringIO import StringIO

class Outcap(object):
    def __init__(self):
        self.output = StringIO()
    def write(self, data):
        sys.stdout.write(data)
        self.output.write(data)
    def flush(self):
        sys.stdout.flush(data)
    def close(self):
        pass

    @property
    def text(self):
        return self.output.getvalue()

outcap = Outcap()

try:
    subprocess.check_call("foo bar baz".split(), stdout=outcap, stderr=outcap)
    subprocess.check_call("one two three".split(), stdout=outcap, stderr=outcap)
except CalledProcessError as e:
    outcap.write("return code: %s\n", e.returncode)
    open("log.txt", "w").write(outcap.text)

Python をアップグレードできないが、Linux を使用している場合、別のオプションは、実行中のコマンドを command でパイプ処理することにより、Python の外部で処理することですtee

your command goes here 2>&1 | tee log.txt

これにより、コマンドのすべての出力が保存さlog.txtれ、標準出力に送信されます。そこから何をするかは、Python スクリプト次第です。たとえば、コマンドの 1 つが失敗した場合にのみ、一時ファイルにログを記録し、それを永続的な場所に移動することができます。

于 2012-07-13T20:38:35.827 に答える