You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本终端日志转存文本文件遇执行中断问题求助

解决Python脚本日志保存到文件的问题

嘿,我来帮你搞定这个问题!你遇到的情况其实是script命令的工作机制导致的——它会启动一个全新的交互式shell会话,你的Python脚本会被挂起,直到这个shell关闭,所以后面的代码根本没机会运行。而且单独调用subprocess.call(['exit'])也没用,因为exit是shell内置命令,subprocess会把它当作外部程序查找,必然报错。

下面给你几个可行的解决方案,从最推荐的原生方法到替代方案都有:

方案一:使用Python内置logging模块(最推荐)

这是Python处理日志的标准方式,能同时把日志输出到终端和文件,还支持日志级别、格式化等高级功能,完全不需要依赖外部命令。

示例代码:

import logging

# 配置日志:同时输出到控制台和文件
logging.basicConfig(
    level=logging.INFO,  # 设置日志级别,低于INFO的日志不会输出
    format='%(asctime)s - %(levelname)s - %(message)s',  # 日志格式
    handlers=[
        logging.FileHandler('logfile.txt'),  # 写入到日志文件
        logging.StreamHandler()  # 输出到终端
    ]
)

# 替换原来的print语句,用logging输出日志
logging.info("这是一条普通运行日志")
logging.warning("这是一条警告信息")
logging.error("这是一条错误日志")

# 如果要保留print语句,也可以,不过统一用logging更规范
print("这条print内容也会被终端显示,但不会写入日志文件,建议替换成logging.info")

方案二:重定向标准输出/错误到文件

如果不想大规模修改代码,只是想把所有终端输出(包括print内容和报错信息)保存到文件,可以直接重定向sys.stdout和sys.stderr。

只保存到文件(终端不显示)

import sys

# 保存原始输出流,方便后续恢复
original_stdout = sys.stdout
original_stderr = sys.stderr

# 打开日志文件,将stdout和stderr定向到文件
with open('logfile.txt', 'a', encoding='utf-8') as log_file:
    sys.stdout = log_file
    sys.stderr = log_file

    # 这里写你的脚本核心代码
    print("这条内容会被写入日志文件")
    # 报错信息也会被写入,比如下面的除以0错误
    # 1 / 0

# 恢复原始输出流,后续内容可以回到终端显示
sys.stdout = original_stdout
sys.stderr = original_stderr
print("这条内容只会在终端显示,不会写入日志")

同时显示在终端和保存到文件

如果想要像script那样同时输出到终端和文件,可以自定义一个类似tee命令的类:

import sys

class TeeStream:
    def __init__(self, filename):
        self.log_file = open(filename, 'a', encoding='utf-8')
        self.original_stream = sys.stdout

    def write(self, data):
        self.log_file.write(data)
        self.original_stream.write(data)
        self.flush()

    def flush(self):
        self.log_file.flush()
        self.original_stream.flush()

# 应用TeeStream到stdout和stderr
sys.stdout = TeeStream('logfile.txt')
sys.stderr = TeeStream('logfile.txt')

# 测试输出
print("这条内容同时显示在终端和写入日志文件")
# 错误信息也会同时处理
# 1 / 0

方案三:用script命令包裹脚本启动(外部调用)

如果坚持想用script命令,不要在脚本内部调用,而是在终端启动脚本时用script包裹:

script logfile.txt python your_script.py

这样整个Python脚本的运行过程都会被script记录到logfile.txt里,脚本也能正常执行,不会被挂起。

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:13:30