我有一个很长的python脚本,经常使用print语句,我想知道是否可以添加一些代码,将所有print语句记录到文本文件或类似文件中。在整个程序中,当用户收到提示时,我仍然希望所有的print语句都转到命令行。如果可能的话,记录用户的输入也是有益的。
我发现这在某种程度上回答了我的问题,但使“print”语句不再打印到命令行
将Python“打印”输出重定向到记录器
您可以将其添加到脚本中:
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
您可以对输出过程执行任何您喜欢的操作。