VSCode终端输出默认不保存,需手动重定向或代码内日志;重定向最轻量(如>、>>、2>&1);调高terminal scrollback可防缓冲丢失;logging.basicConfig可结构化落盘;subprocess适合自动化捕获;调试控制台与终端输出通道分离。

VSCode 运行代码的输出不会自动保存,关掉终端就没了——必须手动重定向或改用日志写入,没有“一键保存”开关。
终端命令运行时直接重定向 stdout/stderr
这是最轻量、最可靠的方式,不依赖 VSCode 设置或插件,本质是 shell 行为。
-
python script.py > output.txt:只保存标准输出,覆盖写入;文件不存在会自动创建 -
python script.py >> output.txt:追加写入,适合多次运行累积日志 -
python script.py > output.txt 2>&1:把错误信息(stderr)也合并进文件,2>&1必须紧贴>,中间不能有空格 - Windows PowerShell 用户注意:
2>&1有效,但cmd.exe中需写成2>&1(同 bash),无需额外转义
终端缓冲区太小导致早期输出丢失
VSCode 默认只保留 1000 行终端历史,长任务跑完一翻页就看不到开头了。
- 按
Ctrl + ,打开设置,搜索terminal scrollback - 把数值调高,比如
5000(日常开发)或100000(监控/测试场景) - 修改后新开终端才生效,旧终端缓冲区不会扩容
- 注意:设太高会吃内存,尤其在低配机器或 WSL 中明显卡顿
Python 脚本内主动写日志文件
适合需要结构化记录、带时间戳、或区分 info/warn/error 的场景,比终端重定向更可控。
- 不用改终端命令,直接在代码开头加几行:
import logginglogging.basicConfig(filename="run.log", level=logging.INFO, format="%(asctime)s - %(message)s")- 之后用
logging.info("训练完成")替代print(),所有日志自动落盘 - 注意:
print()仍只输出到终端,不会进日志文件;必须统一用logging.xxx()
用 subprocess 在 Python 里捕获并保存输出
适合封装成工具脚本,比如一键运行 + 存日志 + 发通知,或集成进 CI 流程。
- 核心是
subprocess.check_output()或subprocess.run()配合stdout/stderr参数 - 示例片段:
result = subprocess.run(["python", "train.py"], capture_output=True, text=True)with open("log.txt", "w") as f:f.write(result.stdout)f.write(result.stderr)- 注意:
capture_output=True等价于stdout=subprocess.PIPE, stderr=subprocess.PIPE;text=True避免字节串处理
真正容易被忽略的是:VSCode 的「调试控制台」(Debug Console)和「集成终端」(Integrated Terminal)是两套输出通道,print() 走终端,logging 默认也走终端——除非你显式指定 filename。别指望改 launch.json 里的 console 字段就能存日志,它只决定输出去哪显示,不决定是否落盘。


















