运行execfile()时将print()命令发送到日志文件

时间:2017-07-26 22:45:40

标签: python

我有一个程序运行一个单独的线程,其中包含三个运行外部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()

2 个答案:

答案 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

现在适用于我的实例。