Python如何在程序最后获取控制台输出内容?

1.问题描述和test程序代码

Python如何在运行完程序之后,在最后获取本程序运行输出的打印内容(包括tdqm的进度条输出内容)并写入文件呢?
程序代码:

import datetime
import os
import sys
import time
from tqdm import tqdm

if __name__ == '__main__':

    #############################################################
    # 这里输出之后的所有的输出的print 内容即将写入日志
    #############################################################
    sum = 0
    data = [1,2,3,4,5,6,7,9]
    for i in tqdm(data):
        tmp = 0
        try:
            tmp = sum+1 / i
        except:
            tmp = 0
        sum += tmp
    print(sum)
    print(666)

2.需要达到的效果

100%|██████████| 8/8 [00:00<?, ?it/s]
177.33015873015873
666
进程已结束,退出代码0

比如上面这个程序在输出之后,在“进程已结束,退出代码0”之前获取之前的所有打印输出内容(包括进度条)并把它写入txt文件,如下图。

txt文件的内容:

100%|██████████| 8/8 [00:00<?, ?it/s]
177.33015873015873
666

已解决。
解决方法如下:


class Logger(object):
    def __init__(self, filename='default.log', stream=sys.stdout):
        self.terminal = stream
        self.log = open(filename,encoding="utf-8", mode='a')

    def write(self, message):
        self.terminal.write(message)
        self.log.write(message)

    def flush(self):
        pass

sys.stdout = Logger(os.path.join(output_path, "第{}批数据日志.log".format(n)), sys.stdout)
sys.stderr = Logger(os.path.join(output_path, "第{}批数据日志.log".format(n)), sys.stderr)

望采纳


可以使用 Python 的 sys.stdout 模块来获取程序的输出并将其写入文件。

下面是一个示例代码,它会将程序的输出保存到文件 output.txt 中:(注意,原本这个print是直接输出到标准输出的,现在通过这个方式可以写到文件了,也就是说,你现在在标准输出看到的都可以写到文件中。替换掉我print的那几行为你原来的运行代码,进度输出之类的就行)

import sys

# 保存原来的标准输出流
original_stdout = sys.stdout

# 创建一个文件,用于保存程序的输出
with open('output.txt', 'w') as f:
    # 将标准输出流替换成文件
    sys.stdout = f

    # 这里是你的代码,所有的输出都会写入文件
    print(100%|██████████| 8/8 [00:00<?, ?it/s])
    print(177.33015873015873)
    print(666)

# 恢复标准输出流
sys.stdout = original_stdout

# 在文件末尾添加一行
with open('output.txt', 'a') as f:
    f.write('进程已结束,退出代码0\n')