我使用以下代码将我的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"中。我怎样才能这样做呢?
答案 0 :(得分:1)
使用subprocess.Popen
代替subprocess.call
,这样您就可以重定向stdout
和stderr
。
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
模块。