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). 然后您可以将该对象指定为stdoutstderr在您的subprocess调用中。

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,则另一种选择是在 Python 之外通过管道传输您正在运行的命令来处理它tee

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

这会将您的命令的所有输出保存log.txt到标准输出并将其发送到标准输出。你从那里选择用它做什么取决于你的 Python 脚本。例如,您可以登录到一个临时文件并仅在其中一个命令失败时将其移动到永久位置。

于 2012-07-13T20:38:35.827 回答