11

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

我发现这在一定程度上回答了我的问题,但使它的“打印”语句不再打印到命令行

将 Python 的“打印”输出重定向到 Logger

4

5 回答 5

16

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

import sys
sys.stdout = open('logfile', 'w')

这将使打印语句写入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

要恢复到仅打印到控制台,只需恢复“备份”

sys.stdout = backup
于 2013-07-25T19:11:45.120 回答
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")
于 2013-07-25T19:15:24.560 回答
3

如果您使用内置的日志记录模块,您可以根据需要为记录器配置尽可能多的输出:文件、数据库、电子邮件等。但是听起来您将打印混合用于两种不同的用途:日志记录(记录程序流供以后检查)和提示。真正的工作是将“打印”的这两种用途拆分为不同的功能,以便您在每个地方都能获得所需的东西。

很多人替换了 python 的通用 sys.stdout 和 sys.stderr 来自动处理发送到控制台的文本。真正的控制台输出总是存在于sys.__stdout__and中sys.__stderr__(所以你不必担心以某种方式“丢失”它)但是如果你将任何具有与文件相同的方法的对象粘贴到变量中sys.stdoutsys.stderr你可以对输出做任何你喜欢的事情过程。

于 2013-07-25T19:22:13.213 回答
3

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

    Exception ignored in: <__main__.Logger object at 0x7f04083760f0>
    AttributeError: 'Logger' object has no attribute 'flush'

我添加了以下功能以使其工作:

    def flush(self):
        pass
于 2019-02-07T18:13:27.077 回答
-2

嗯......很难实现你自己的 print() 函数和装饰器来记录传递给你的 print 函数的任何内容吗?

def logger(func):
    def inner(*args, **kwargs):
        log(*args, **kwargs)  # your logging logic
        return func(*args, **kwargs)
    return inner

@logger
def lprint(string_to_print):
    print(string_to_print)   
于 2013-07-25T19:37:59.937 回答