Python,记录打印语句,同时将它们打印到stdout

shr*_*ish 8 python printing logging stdout

我有一个很长的python脚本经常使用print语句,我想知道是否有可能添加一些代码,将所有的print语句记录到文本文件或类似的东西.当用户在整个程序中被提示时,我仍然希望所有的print语句都转到命令行.如果可能的话,记录用户的输入也是有益的.

我发现这有点回答我的问题,但使"print"语句不再打印到命令行

将Python'print'输出重定向到Logger

jh3*_*314 15

您可以将其添加到脚本中:

import sys
sys.stdout = open('logfile', 'w')
Run Code Online (Sandbox Code Playgroud)

这将使print语句写入logfile.

如果您想要打印到stdout文件和文件,您可以尝试这样做:

class Tee(object):
    def __init__(self, *files):
        self.files = files
    def write(self, obj):
        for f in self.files:
            f.write(obj)

f = open('logfile', 'w')
backup = sys.stdout
sys.stdout = Tee(sys.stdout, f)

print "hello world"  # this should appear in stdout and in file
Run Code Online (Sandbox Code Playgroud)

要恢复到只打印到控制台,只需恢复"备份"

sys.stdout = backup
Run Code Online (Sandbox Code Playgroud)


Rob*_*obᵩ 10

这是一个执行您所描述的程序:

#! /usr/bin/python3

class Tee:
    def write(self, *args, **kwargs):
        self.out1.write(*args, **kwargs)
        self.out2.write(*args, **kwargs)
    def __init__(self, out1, out2):
        self.out1 = out1
        self.out2 = out2

import sys
sys.stdout = Tee(open("/tmp/log.txt", "w"), sys.stdout)

print("hello")
Run Code Online (Sandbox Code Playgroud)


Cam*_*ilo 5

当尝试 python 3.7 上接受的最佳答案时,我遇到了以下异常:

    Exception ignored in: <__main__.Logger object at 0x7f04083760f0>
    AttributeError: 'Logger' object has no attribute 'flush'
Run Code Online (Sandbox Code Playgroud)

我添加了以下函数以使其工作:

    def flush(self):
        pass
Run Code Online (Sandbox Code Playgroud)