Python,记录打印语句,同时将它们打印到标准输出
我有一个很长的python脚本,经常使用print语句,我想知道是否可以添加一些代码,将所有print语句记录到文本文件或类似文件中。在整个程序中,当用户收到提示时,我仍然希望所有的print语句都转到命令行。如果可能的话,记录用户的输入也是有益的 我发现这在某种程度上回答了我的问题,但使“print”语句不再打印到命令行Python,记录打印语句,同时将它们打印到标准输出,python,logging,printing,stdout,Python,Logging,Printing,Stdout,我有一个很长的python脚本,经常使用print语句,我想知道是否可以添加一些代码,将所有print语句记录到文本文件或类似文件中。在整个程序中,当用户收到提示时,我仍然希望所有的print语句都转到命令行。如果可能的话,记录用户的输入也是有益的 我发现这在某种程度上回答了我的问题,但使“print”语句不再打印到命令行 您可以将以下内容添加到脚本中: import sys sys.stdout = open('logfile', 'w') 这将使打印语句写入日志文件 如果您想要打印到std
您可以将以下内容添加到脚本中:
import sys
sys.stdout = open('logfile', 'w')
这将使打印语句写入日志文件
如果您想要打印到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
要恢复到仅打印到控制台,只需恢复“备份”
下面是一个程序,它实现了您所描述的功能:
#! /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")
如果您使用内置的,您可以根据需要为记录器配置尽可能多的输出:文件、数据库、电子邮件等。不过,听起来您将打印混合用于两种不同的用途:记录(记录程序流以供以后检查)和提示。真正的工作将是将“打印”的这两种用途分成不同的功能,以便在每个地方都能得到所需的内容
很多人会自动处理发送到控制台的文本。真正的控制台输出总是存在于
sys.\uuu stdout\uuuu
和sys.\uu stderr\uuuuu
中(因此您不必担心会以某种方式“丢失”它)但是,如果您使用与文件相同的方法将任何对象粘贴到变量sys.stdout
和sys.stderr
中,您可以对输出过程执行任何操作。hm。。。实现自己的print()函数和将记录传递给print函数的任何内容的decorator是否困难
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)
在尝试python 3.7上接受的最佳答案时,我遇到了以下异常:
Exception ignored in: <__main__.Logger object at 0x7f04083760f0>
AttributeError: 'Logger' object has no attribute 'flush'
@抢劫ᵩ @斯蒂芬-我觉得我一点都不好笑。“我在试图了解OP到底想从我们这里得到什么。”罗布ᵩ 我想他是在问如何让
print“hi”
用一个语句去两个不同的地方为什么你们都使用一个类,为什么他们都叫Tee
?我使用了一个类,因为print
最终会调用sys.stdout.write()
。因为我正在替换sys.stdout
,所以我的替换需要有一个.write()
。我在the之后称它为Tee
,它本身就是以.interest命名的。您是否也独立运行我的程序,而不使用任何代码?它是否生成了一个非空的/tmp/log.txt
,然后?@reddman-您可以尝试将self.out1.flush()
和self.out2.flush()
添加到Tee.write():
。
Exception ignored in: <__main__.Logger object at 0x7f04083760f0>
AttributeError: 'Logger' object has no attribute 'flush'
def flush(self):
pass