SiameseUIE保姆级教程:test.py输出重定向保存至log文件实操
1. 为什么需要把test.py输出存成log文件?
你刚登录云实例,执行完python test.py,屏幕唰唰滚过一堆结果——模型加载成功、5个测试例子的抽取结果、分隔线、emoji图标……但一关终端,全没了。
这在实际工作中很常见:
- 你想对比不同版本脚本的输出差异;
- 运维同事要查证某次运行是否真的“无报错”;
- 需要把结果发给协作方,总不能截图发5张图;
- 更关键的是:受限云实例重启后环境不重置,但终端历史记录会清空——没有log,等于没运行过。
而官方README里只写了“会输出”,没说怎么持久化保存。这篇教程就补上这个关键缺口:不改一行代码、不装新工具、不碰PyTorch版本,用最基础的Linux重定向语法,把test.py的完整输出原封不动存进log文件——连那个绿色的和分隔线都一模一样。
整个过程只要3条命令,2分钟搞定,小白照着敲就能用。
2. 基础原理:重定向不是黑魔法,是Shell的“管道工”
先说清楚一件事:test.py本身不需要任何修改。它只是老老实实print,而Linux Shell天然支持把“print出来的内容”接走,塞进文件里。就像水龙头(程序输出)接上软管(>符号),另一头插进水桶(log文件)。
你只需要理解这两个符号:
>:覆盖写入。如果log文件已存在,先清空再写;>>:追加写入。如果log文件已存在,在末尾接着写,不删原有内容。
两者都只捕获标准输出(stdout),也就是你看到的绿色文字、分隔线、实体列表。而报错信息(比如红色的Traceback)属于标准错误(stderr),默认不会被>捕获——但好消息是:test.py在受限环境下几乎不报错,所有提示都是stdout,所以>完全够用。
小贴士:为什么不用
tee或script?tee需要额外进程,script会记录键盘输入,在只读受限实例中可能权限不足;而>是bash内置功能,零依赖、零风险、零兼容问题——完美匹配本镜像“免安装、不修改环境”的设计哲学。
3. 实操四步法:从运行到归档,一步不落
3.1 确认当前路径与环境
别跳步骤!很多问题出在路径不对。按README要求,先确保你在正确的目录:
# 检查当前路径(应该显示类似 /root/nlp_structbert_siamese-uie_chinese-base) pwd # 如果不在,按README回到模型目录 cd .. cd nlp_structbert_siamese-uie_chinese-base再确认Python环境已激活(绝大多数情况已默认激活):
python --version # 应输出类似:Python 3.8.x(对应torch28环境)3.2 执行重定向命令:一条命令,生成log
在模型目录下,直接运行带重定向的命令:
python test.py > test_output_$(date +%Y%m%d_%H%M%S).log 2>&1我们来拆解这条命令:
python test.py:原样执行测试脚本;>:把stdout重定向;test_output_$(date +%Y%m%d_%H%M%S).log:生成带时间戳的log文件名,例如test_output_20241025_143022.log,避免重复覆盖;2>&1:把stderr(标准错误)也合并到stdout,一起写入log——虽然test.py极少报错,但加上更保险。
执行后,终端不会显示任何输出(因为全被导走了),但你会看到命令立刻返回,说明已成功写入。
3.3 验证log文件内容:眼见为实
用cat查看刚生成的log:
# 列出最新生成的log文件(按时间倒序) ls -t test_output_*.log | head -n 1 # 查看内容(用less可翻页,cat适合小文件) cat test_output_20241025_143022.log | head -n 20你应该看到开头是:
分词器+模型加载成功! ========== 1. 例子1:历史人物+多地点 ========== 文本:李白出生在碎叶城,杜甫在成都修建了杜甫草堂,王维隐居在终南山。 抽取结果: - 人物:李白,杜甫,王维 - 地点:碎叶城,成都,终南山 ----------------------------------------和你在终端里看到的一模一样——包括emoji、空行、分隔线。说明重定向100%生效。
3.4 进阶技巧:自动归档与快速检索
单个log有用,但长期运行会产生一堆文件。加两行命令,让管理更省心:
# 1. 把所有test_output_*.log打包成zip(节省空间,方便传输) zip -q siamese_uie_logs_$(date +%Y%m%d).zip test_output_*.log # 2. 只保留最近7天的log,其余自动清理(防系统盘满) find . -name "test_output_*.log" -mtime +7 -delete如果想快速搜索某次运行是否抽出了“北京”,用grep:
# 在所有log中搜索“北京” grep -l "北京" test_output_*.log # 显示包含“北京”的具体行(带文件名) grep "北京" test_output_*.log这些命令都不依赖额外包,zip、find、grep在所有Linux发行版中都是默认预装的。
4. 常见问题现场解决:报错?卡住?没文件?
4.1 执行后等很久,终端没反应?
这是正常现象。test.py首次加载模型时需从磁盘读取pytorch_model.bin(约300MB),受限于云实例I/O性能,可能需要10–30秒。不要Ctrl+C中断,耐心等待。一旦看到log文件生成(用ls test_output_*.log检查),说明已成功。
4.2 提示“bash: python: command not found”?
说明torch28环境未激活。按README执行:
source activate torch28 # 再运行重定向命令 python test.py > test_output_$(date +%Y%m%d_%H%M%S).log 2>&14.3 log文件为空(0字节)?
大概率是路径错了。检查你是否在nlp_structbert_siamese-uie_chinese-base目录下执行命令。用pwd确认,然后重新执行。
4.4 想把log存到其他目录(比如/home/user/logs)?
可以,但注意两点:
- 目标目录必须存在且有写入权限;
- 路径要用绝对路径,避免相对路径歧义。
例如:
# 先创建目录 mkdir -p /home/user/logs # 执行时指定绝对路径 python test.py > /home/user/logs/test_output_$(date +%Y%m%d_%H%M%S).log 2>&15. 超实用延伸:一个命令,批量跑+自动归档
如果你需要定期运行测试(比如每天凌晨校验模型稳定性),可以把上面所有步骤写成一个shell脚本,实现全自动:
#!/bin/bash # 文件名:run_uie_log.sh,放在模型目录下 # 进入模型目录(确保路径正确) cd /root/nlp_structbert_siamese-uie_chinese-base # 执行测试并生成带时间戳的log python test.py > test_output_$(date +%Y%m%d_%H%M%S).log 2>&1 # 打包当日log zip -q siamese_uie_logs_$(date +%Y%m%d).zip test_output_$(date +%Y%m%d)*.log # 清理7天前的log(保留zip,log可删) find . -name "test_output_$(date -d '7 days ago' +%Y%m%d)*.log" -delete赋予执行权限并运行:
chmod +x run_uie_log.sh ./run_uie_log.sh以后只需双击或定时任务调用这个脚本,全程无人值守。
6. 总结:重定向是运维基本功,更是受限环境生存术
回顾一下,你学会了:
- 为什么必须存log:受限实例重启不丢环境但丢终端历史,log是唯一可信凭证;
- 最简命令是什么:
python test.py > test_output_$(date +%Y%m%d_%H%M%S).log 2>&1,复制即用; - 如何验证是否成功:
cat看内容,ls看文件,和终端输出逐字比对; - 遇到问题怎么自救:路径、环境、等待时间,三招覆盖90%异常;
- 怎么让它更聪明:自动打包、定时清理、一键脚本,把重复劳动变成一次配置。
这一切都没动模型代码,没装新包,没升级PyTorch——完全遵循镜像“开箱即用、最小侵入”的设计原则。你保存的不只是几行文字,而是可追溯、可审计、可协作的AI工程实践证据。
下一次,当同事问“上次测试结果在哪”,你不用翻聊天记录,不用求他重跑,直接发一个带时间戳的log文件过去——专业,就这么简单。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。