Python捕获stdout / stderr并记录到文件,同时看到输出

时间:2018-10-31 18:08:40

标签: python linux logging

所以我有一个python脚本正在尝试自动执行整个构建过程。这样,它不仅在调用python文件,而且还在调用shell脚本,maven等。所以我想要的是一种方法/过程/库,用于将输出输出到stdout和stderr到日志文件,同时即使将其打印到控制台,打印到控制台的东西不是python脚本。

我们正在Linux机器上工作,因此当手动执行此操作时,我们先执行script,然后执行所有命令,然后执行exit。但是,当尝试将其包装在python脚本中时,该脚本似乎接受了shell的命令,并且直到我先exit才允许我运行其余命令。

为证明概念,下面是一个bash脚本,该脚本每半秒打印一次数字,直到10。

print_nums.bash

#!/bin/bash

for i in {1..10}
do
    echo "$i"
    sleep 0.5
done

这就是我想要做的。

test_script.py

import os

def main():
    cmd1 = "script /some/arbitrary/path/logfile.txt"
    cmd2 = "/path/to/print_nums.bash"
    cmd3 = "exit"

    os.system(cmd1)

    os.system(cmd2)

    os.system(cmd3)

if __name__ == '__main__':
    main()

我也研究了日志记录模块,但似乎只能轻松地将python打印内容捕获到日志中。我可能会弄错了,如果有一种直言不讳的方式,我肯定会改变方法。但从本质上讲,我希望能够在python中有效地表示从这里开始我要记录控制台输出,在这里我想以编程方式结束对它的记录。

您可以想象,构建命令和初始测试会花费很长的时间,例如15到20分钟,如果您只是做了

,那么控制台等待很长时间没有任何输出就很长了

some_command.bash > logfile.txt

1 个答案:

答案 0 :(得分:0)

对我来说,最简单的方法就是jww的回答。如果需要将另一个脚本的输出附加到同一日志文件中,请在python脚本中将os.systemtee -atest_script.py结合使用。

import os def main(): cmd1 = "path/to/aribitrary_script | tee /path/to/logfile" cmd2 = "path/to/another_script | tee -a /path/to/logfile" os.system(cmd1) os.system(cmd2) if __name__ == '__main__': main()

{{1}}