我有一个程序运行一个单独的线程,其中包含三个运行外部Python脚本的execfile()语句。在不更改这些脚本的情况下,是否有办法让print()语句将其命令打印到日志文件中?从下面的代码中,我需要File1,File2和File3中的print命令进入日志文件,而无法更改这些文件。这可能吗?
代码:
MyThread.py
import threading
class MyThread(threading.Thread):
def run(self):
execfile('File1.py')
execfile('File2.py')
execfile('File3.py')
Program.py
from MyThread import *
MyThread().start()
我已经看到此处发布的问答(redirect prints to log file)并尝试了此解决方案,但外部文件中的print()语句未添加到日志文件中:
import threading, sys
class MyThread(threading.Thread):
def run(self):
old_stdout = sys.stdout
output_file = open('output.log', 'w')
sys.stdout = output_file
execfile('File1.py')
execfile('File2.py')
execfile('File3.py')
sys.stdout = old_stdout
output_file.close()
答案 0 :(得分:0)
好的,所以这很有趣。我做的是我使用print->文件方法frm here并将其添加到我想要运行的文件中。
my_thread.py
import threading
def prepend_stdout(filename):
with open(filename, 'r+') as f:
std_out = 'import sys\nold_stdout = sys.stdout\nlog_file = open("message.log","w")\nsys.stdout = log_file\n'
content = f.read()
return std_out + content
class MyThread(threading.Thread):
def run(self):
content = prepend_stdout("test.py")
exec(content)
MyThread().start()
test.py
print("whatever, man")
然后我运行了python my_thread.py
,“message.log”中的输出是
whatever, man
答案 1 :(得分:0)
我尝试了解决方案发布了我的Cory Madden,直到exec()
调用(此后没有打印,来自线程内的print()
次调用)。然后我回到最初给出的建议答案(redirect prints to log file)并做了一些不同的事情来解决问题。通过在每个output_file.flush()
语句后添加行execfile()
,print()
脚本中的execfile()
命令现在可以打印到外部日志文件中。因此:
...
def run(self):
old_stdout = sys.stdout
output_file = open('path/to/file.log', 'w')
sys.stdout = output_file
execfile('File1.py')
output_file.flush()
execfile('File2.py')
output_file.flush()
execfile('File3.py')
output_file.flush()
output_file.close()
sys.stdout = old_stdout
现在适用于我的实例。