提问者:小点点

Python,记录打印语句,同时将它们打印到标准输出


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

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

将Python“打印”输出重定向到记录器


共3个答案

匿名用户

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

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

这将使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

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

sys.stdout = backup

匿名用户

下面是一个程序,它实现了您所描述的功能:

#! /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")

匿名用户

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

许多人取代了python的通用sys。标准输出和系统。stderr可以自动对发送到控制台的文本进行处理。真正的控制台输出始终存在于sys中__标准输出系统__stderr_uu(因此您不必担心会以某种方式“丢失”它),但是如果您使用与文件相同的方法将任何对象粘贴到变量sys中。标准输出和系统。stderr您可以对输出过程执行任何您喜欢的操作。