我有一个经常使用打印语句的长 python 脚本,我想知道是否可以添加一些代码,将所有打印语句记录到文本文件或类似文件中。当用户在整个程序中得到提示时,我仍然希望所有打印语句都进入命令行。如果可能的话,记录用户的输入也是有益的。
我发现这在一定程度上回答了我的问题,但使它的“打印”语句不再打印到命令行
我有一个经常使用打印语句的长 python 脚本,我想知道是否可以添加一些代码,将所有打印语句记录到文本文件或类似文件中。当用户在整个程序中得到提示时,我仍然希望所有打印语句都进入命令行。如果可能的话,记录用户的输入也是有益的。
我发现这在一定程度上回答了我的问题,但使它的“打印”语句不再打印到命令行
您可以将其添加到您的脚本中:
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
这是一个执行您描述的程序:
#! /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.stdout 和 sys.stderr 来自动处理发送到控制台的文本。真正的控制台输出总是存在于sys.__stdout__
and中sys.__stderr__
(所以你不必担心以某种方式“丢失”它)但是如果你将任何具有与文件相同的方法的对象粘贴到变量中sys.stdout
,sys.stderr
你可以对输出做任何你喜欢的事情过程。
在尝试在 python 3.7 上接受的最佳答案时,我遇到了以下异常:
Exception ignored in: <__main__.Logger object at 0x7f04083760f0>
AttributeError: 'Logger' object has no attribute 'flush'
我添加了以下功能以使其工作:
def flush(self):
pass
嗯......很难实现你自己的 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)