VSCode终端输出默认不落盘,需手动重定向或用logging;shell重定向(>、>>、2>&1)最简捷,跨平台兼容;logging适合结构化日志;subprocess可捕获输出用于自动化;调试时仅能通过修改代码或subprocess保存日志。

VSCode 终端运行代码的输出默认不落盘,关掉就丢——没有“自动保存”开关,必须手动重定向或改用日志机制。
终端里直接用 > 或 >> 重定向最简单
这是 shell 层面的行为,VSCode 完全兼容,不依赖插件、设置或 Python 版本。
-
python script.py > output.txt:覆盖写入标准输出(stdout),文件不存在会自动创建 -
python script.py >> output.txt:追加写入,适合多次运行累积日志 -
python script.py > output.txt 2>&1:把错误(stderr)也合并进文件;2>&1必须紧贴>,中间不能有空格 - Windows PowerShell 用户注意:
2>&1有效,和 bash 行为一致;cmd.exe 同样支持,无需额外转义 - 相对路径基于终端当前工作目录(通常是项目根目录),不是
.py文件所在位置
脚本内用 logging.basicConfig 写结构化日志
适合需要时间戳、分级(INFO/WARN/ERROR)、多线程安全或长期维护的场景,比 print 重定向更健壮。
- 必须显式调用
logging.basicConfig,否则logging.info()不会写入文件 -
filename="app.log"是相对当前工作目录的路径;若要固定到脚本同目录,建议用os.path.join(os.path.dirname(__file__), "log.txt") -
filemode="w"才会覆盖旧日志,默认是追加("a") -
print()输出仍只走终端,不会进日志文件;所有需落盘的内容必须统一用logging.xxx() - 调试时想同时看到控制台和文件?得手动添加
StreamHandler和FileHandler
用 subprocess.run 在 Python 里捕获并保存输出
适合封装成自动化流程,比如一键运行 + 存日志 + 校验返回值,或集成进 CI 脚本。
-
capture_output=True等价于stdout=subprocess.PIPE, stderr=subprocess.PIPE - 务必加
text=True,否则result.stdout是字节串,写文件前还得 decode - 第三方库(如
requests、matplotlib)的print也会被捕获,但sys.stdout被重定向后的行为可能干扰子进程 - 如果被调脚本本身含
input()或需要交互,subprocess会卡住,此时不适合用此方式
别指望 launch.json 的 console 字段能存日志
"console": "integratedTerminal" 或 "externalTerminal" 只决定输出显示位置,不影响是否落盘。调试模式(F5)下无法直接 shell 重定向,只能靠变通。
-
"redirectOutput": true是旧版配置,新版 Python 扩展已弃用,设了也没效果 - 想在调试时存日志,可靠做法只有两种:① 改代码用
logging;② 把"console": "none"配合subprocess自行捕获 - 有人试过在
args里传["-u", ">", "log.txt"],这实际无效——Python 解释器不识别>,那是 shell 解析的 - 用
tasks.json封装带重定向的命令,再绑定快捷键,是调试外场景最顺手的折中方案
真正容易被忽略的是:终端缓冲区限制和重定向的生效时机。调高 terminal scrollback 只防翻页丢失,不解决关终端即丢;而所有重定向操作(无论是 shell 还是 sys.stdout = open(...))都必须在第一行 print() 之前完成,晚了就漏掉开头几行。


















