第一种方法——重定义
1. 背景知识
在Python中,print函数的输出是通过sys.stdout这个标准输出流来实现的。默认情况下,sys.stdout指向控制台(也就是终端窗口)。当您执行print("Hello, World!")时,实际上是调用了sys.stdout.write("Hello, World!\n")。
因此,如果我们能够重定向sys.stdout,让它指向我们自定义的对象,就可以控制print函数的输出行为。
2. 实现思路
• 目标:让print函数的输出同时写入日志文件和显示在控制台上。
• 方法:创建一个自定义的类(例如Logger),重写write和flush方法。然后,将sys.stdout替换为该类的实例。
import logging
import sys
class Logger(object):
def __init__(self, filename="training.log", stream=sys.stdout):
self.terminal = stream # 保存原始的标准输出流,默认是控制台sys.stdout
self.log = open(filename, 'w', encoding='utf-8') # 打开日志文件,追加模式
def write(self, message):
self.terminal.write(message) # 输出到控制台
self.log.write(message) # 写入日志文件
def flush(self):
self.terminal.flush() # 刷新控制台
self.log.flush() # 刷新日志文件
#
def close(self): # 关闭日志文件
self.log.close()
# 重定向sys.stdout
sys.stdout = Logger("training.log", sys.stdout)
# 示例:在代码中使用print
print("开始训练模型...")
for epoch in range(5):
print(f"Epoch {epoch+1}/5")
# 模拟训练过程
train_loss = 0.01 * (5 - epoch)
print(f"训练损失:{train_loss:.4f}")
print("训练完成。")
print('nihao')
这样不仅会在我们的终端控制台中显示,还可以保存到我们的日志文件training.log中
第二种方法——重定向
sh /root/task/train_model.sh > /root/task/train_log
标准输出(stdout)重定向:> 符号只重定向标准输出。如果您的脚本中有错误信息输出到标准错误(stderr),这些信息不会被保存到 train_log,而是仍然显示在终端。
第三种方法——最简单
import sys
# 暂存,用于恢复
temp = sys.stdout
# 把输出重定向到文件
f = open('screenshot.log', 'w')
# 之后使用print函数,都将内容打印到 screenshot.log 文件中
sys.stdout = f
a = 1
if a < 5 :
print(123)
else:
print(456)
if isinstance(a,int):
print(000)
else:
print(1111)
f.close()