在子进程中也将打印重定向到日志文件

时间:2014-11-05 02:49:22

标签: python logging subprocess

我使用以下代码将我的print语句重定向到文本文件中。

old_stdout = sys.stdout
log_file = open("message.log","w")
sys.stdout = log_file
print "this will be written to message.log"

subprocess.call("iPython.exe", "script.py") #subprocesses here take this form

sys.stdout = old_stdout
log_file.close()

我的问题是这似乎不适用于子进程。 " script.py"中的打印语句不会出现在" message.log"中。我怎样才能这样做呢?

1 个答案:

答案 0 :(得分:1)

使用subprocess.Popen代替subprocess.call,这样您就可以重定向stdoutstderr

import subprocess

with (open('message_stdout.log', 'w'), open('message_stderr.log', 'w')) as (stdout_file, stderr_file):
    my_process = subprocess.Popen(["iPython.exe", "script.py"],
                                   stdout=stdout_file,
                                   stderr=stderr_file)

您还可以将stderr重定向到这样的stdout,以便将script.py的所有输出发送到单个文件。

import subprocess

with open('message.log', 'w') as stdout_file:
    my_process = subprocess.Popen(["iPython.exe", "script.py"],
                                   stdout=stdout_file,
                                   stderr=subprocess.STDOUT)

然而,对只调用iPython来加载另一个脚本的东西进行子处理是一种糟糕的工作方式。相反,您应该直接调用script.py模块。