如何自定义你的Traceback伪装器?基于NTTS源码改造sys.excepthook的完整教程
发布时间:2026/8/19 20:44:18 作者:尧图编辑部 阅读量:1,286

如何自定义你的Traceback伪装器基于NTTS源码改造sys.excepthook的完整教程【免费下载链接】NTTSNO TIME TO SLEEP项目地址: https://gitcode.com/gh_mirrors/ntt/NTTS在 Python 开发中sys.excepthook是异常输出的幕后开关而开源项目NTTSThere is No Time to Sleep正是利用它打造了一款有趣的Traceback 伪装器按下 CtrlC 时它能把你停在time.sleep()上的报错巧妙伪装成正在运行神经网络模型的高大上样子。这篇文章将带你从源码层面拆解 NTTS手把手教你如何自定义 Traceback 伪装器通过改造sys.excepthook完全掌控异常输出全程无需复杂编程基础。一、NTTS 是什么先认识这个没时间睡觉的伪装神器NTTS 全称There is No Time to Sleep没时间睡觉了是一个纯 Python 实现的趣味开源库。它解决的痛点很真实当你调试代码时按下 CtrlC 中断程序Python 默认会把 Traceback 停留在time.sleep()这类真实代码上看起来就像程序卡在睡觉在同事面前十分尴尬。引入 NTTS 之后Traceback 的最后一行会变成这样Traceback (most recent call last): File d:/GitHub/test.py, line 14, in module a() File C:/Users/admin/anaconda3/envs/torch/lib/site-packages/mindx/model.py, line 23, in c Model.inference(img) KeyboardInterrupt从程序睡着了瞬间变成我在跑深度学习模型。整个项目的核心源码只集中在NTTS/ntts.py与NTTS/__init__.py两个文件里结构非常精简堪称理解sys.excepthook机制的最佳入门案例。二、sys.excepthook 是什么Python 异常输出的幕后开关动手改造之前先理解关键机制当 Python 解释器遇到未捕获异常时会调用sys.excepthook(type, value, traceback)这个回调函数来输出错误信息默认实现就是我们熟悉的完整 Traceback 打印。这意味着只要替换sys.excepthook我们就能接管所有未捕获异常的最终输出。NTTS 的整个伪装逻辑正是建立在这个机制之上——它没有改动任何真实业务代码只改写了错误信息怎么说这一层。三、NTTS 源码解析Traceback 伪装器的核心工作原理NTTS 的灵魂是NTTS/ntts.py中的excepthook_decorator函数def excepthook_decorator(excepthook, filename, lineno, line): def wrapper(exctype, value, exctracback): if exctype is KeyboardInterrupt: format traceback.format_tb(exctracback) frame {filename: filename, lineno: lineno, name: format[-1].split(\n)[0].split( )[-1], line: line, locals: None, exname: KeyboardInterrupt} msg .join(reformat(frame, format)) print(msg, filesys.stderr) else: excepthook(exctype, value, exctracback) return wrapper这段代码有几个巧妙设计非常值得学习只伪装 KeyboardInterrupt只有 CtrlC 触发的中断才走伪装逻辑其他异常原样交给原始excepthook保证正常 bug 排查不受影响保留真实调用栈配套的reformat函数只替换最后一行 frame前面的调用链原样保留让伪装看起来真实可信三个核心参数filename伪装的绝对路径、lineno伪装的代码行号、line伪装的代码内容——这就是我们自定义的全部入口。四、自定义 Traceback 伪装器三个参数掌控全局NTTS 的默认配置写在NTTS/__init__.py中package_path get_package_path() sys.excepthook excepthook_decorator( sys.excepthook, os.path.join(package_path, mindx, model.py), 23, Model.inference(img) )其中get_package_path()会自动探测 site-packages 目录再把伪装路径指向其中的mindx/model.py。想自定义其实非常简单——换掉这三个参数即可。例如把自己伪装成一名大数据工程师import sys from NTTS.ntts import excepthook_decorator sys.excepthook excepthook_decorator( sys.excepthook, /home/user/bigdata/pipeline.py, # 伪装的文件路径 88, # 伪装的行号 process_batch(batch_data) # 伪装的代码内容 )把以上代码保存为my_disguise.py在入口文件import my_disguise再按 CtrlC 试试Traceback 的最后一行就会变成你自定义的内容。参数可以随意组合想装前端就写render_component()想装爬虫就写parse_html(response)想装运维就写check_health(host)——全看你的需求自由度极高。五、进阶玩法打造你的专属 Time to Sleep 变体除了默认的AI 模型人设NTTS 还内置了一个子包NTTS/tts/__init__.py它把最后一行替换成time.sleep(6)配合一行导入即可使用import NTTS.tts效果如下Traceback (most recent call last): File /workspaces/main.py, line 11, in module write() File /root/anaconda3/lib/python3.9/site-packages/mindx/__init__.py, line 57, in write time.sleep(6) KeyboardInterrupt这段代码本质上调用的是同一个excepthook_decorator只是传入了不同的参数。理解了原理后你完全可以照葫芦画瓢新建一个属于自己的模块封装任意想要的人设。六、免 import 自动生效利用 ntts.pth 实现启动即加载如果嫌每次都要import NTTS太麻烦项目还提供了ntts.pth文件——它的内容只有一行import NTTS。把该文件拷贝到 Python 的 site-packages 目录下可用python -c import site; print(site.getsitepackages())查看具体路径Python 解释器启动时就会自动执行这行导入无需修改任何业务代码即可全局生效非常适合在 demo 演示机上使用。七、常见问题与注意事项会影响正常调试吗不会。伪装只在 KeyboardInterrupt 时触发其他异常仍输出真实的 Traceback。会改变异常本身吗不会。这里只修改了打印输出层面sys.exc_info()拿到的仍是原始异常对象。生产环境能用吗建议仅在 demo、演示等场景使用毕竟骗人的报错信息可能会误导同事排错。想彻底移除删除import语句或移除ntts.pth文件即可恢复默认行为。如果想获取完整源码动手实验可以执行git clone https://gitcode.com/gh_mirrors/ntt/NTTS然后在项目根目录运行pip install -e .即可完成安装。现在去给你的 Traceback 加上一层专属伪装吧【免费下载链接】NTTSNO TIME TO SLEEP项目地址: https://gitcode.com/gh_mirrors/ntt/NTTS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考