ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

深入NTTS源码:sys.excepthook与traceback模块如何联手重写KeyboardInterrupt输出

深入NTTS源码:sys.excepthook与traceback模块如何联手重写KeyboardInterrupt输出 深入NTTS源码sys.excepthook与traceback模块如何联手重写KeyboardInterrupt输出【免费下载链接】NTTSNO TIME TO SLEEP项目地址: https://gitcode.com/gh_mirrors/ntt/NTTS你是否遇到过这样的尴尬代码明明在等time.sleep()按下 CtrlC 后 Traceback 却老老实实停在sleep上一看就是菜鸟在写阻塞代码开源项目 NTTSThere is No Time to Sleep没时间睡觉给出了一个脑洞大开的解决方案它通过sys.excepthook拦截 Python 的未捕获异常再用traceback 模块重写 KeyboardInterrupt 的输出让崩溃堆栈的最后一行变成mindx/model.py里的Model.inference(img)瞬间让你的代码看起来像在跑神经网络本文将带你逐行拆解它的实现原理。先认识两位主角sys.excepthook 与 traceback 模块在进入源码之前先弄懂两个 Python 内置机制这是理解 NTTS 的关键。sys.excepthook 是 Python 的全局异常出口。当程序抛出异常且没有任何 try/except 捕获时解释器会把(异常类型, 异常值, traceback对象)交给sys.excepthook默认行为就是向标准错误打印完整的堆栈信息。换句话说我们平时看到的红色 Traceback就是这个钩子打印出来的。traceback 模块则是堆栈格式化器。它负责把 traceback 对象转换成易读的文本例如traceback.format_tb()会返回一个字符串列表每个元素对应堆栈中的一层调用帧。NTTS 的妙处正是把这两个机制组合起来先接管全局钩子再对堆栈文本动手脚。相关导入见 NTTS/ntts.py。NTTS 如何偷梁换柱重写 KeyboardInterrupt 输出整个魔术的核心是一个装饰器excepthook_decorator位于 NTTS/ntts.py逻辑只有四步判断异常类型if exctype is KeyboardInterrupt只有 CtrlC 触发的中断才被美化其他异常原样放行保持透明。格式化真实堆栈调用traceback.format_tb(exctracback)拿到当前调用链的文本列表。构造假最后一帧把最后一行替换成预先设定的内容——默认是mindx/model.py第 23 行的Model.inference(img)仿佛你的程序正卡在深度模型的推理环节。交给 reformat 重组输出拼接出Traceback最近一次调用的完整格式打印到标准错误。其余异常则调用原始的excepthook保证程序行为不被破坏。这种装饰器 兜底回退的写法非常干净值得学习。重写前后对比效果有多酷炫为了直观展示test.py 提供了一个演示脚本。重写前的输出可能长这样Traceback (most recent call last): File test.py, line 14, in module b() File test.py, line 5, in a time.sleep(6) KeyboardInterrupt而导入 NTTS 之后同样的 CtrlC 会变成Traceback (most recent call last): File test.py, line 14, in module b() File C:/.../site-packages/mindx/model.py, line 23, in c Model.inference(img) KeyboardInterrupt看到区别了吗真实的堆栈帧被偷换成了mindx/model.py不明真相的同事看到后第一反应大概率是原来你在训练模型啊reformat 函数最后一行的换脸手术堆栈重组的具体工作在reformat函数中完成见 NTTS/ntts.py。它的处理顺序是在堆栈列表头部补上Traceback (most recent call last):前缀用构造好的假帧文件名、行号、函数名、代码行替换列表最后一个元素支持locals变量展示虽然默认传None但保留了扩展空间。值得注意的是假帧的函数名并非硬编码而是通过format[-1].split(...)从原堆栈的最后一行解析出来的这样即使调用场景不同输出也能保持以假乱真。包入口与 .pth 自动导入的秘密那么为什么import NTTS之后一切就自动生效了答案在包入口文件 NTTS/init.pysys.excepthook excepthook_decorator(sys.excepthook, ...)只要包被导入它就会立刻把全局钩子替换成装饰后的版本实现零配置注入。更妙的是项目还提供了 ntts.pth 文件。只要把它拷贝到site-packages目录Python 启动时会自动执行其中的import NTTS连显式 import 都省了——真正的悄无声息。附属包 NTTS.tts让 Traceback 变成在睡觉如果说 NTTS 是假装在训练模型那附属包 NTTS/tts/init.py 就是假装在睡觉。它复用同一个装饰器把最后一行替换成了time.sleep(6)专治明天要 demo 还在纠结异步阻塞的焦虑README 里甚至戏称这能带来确定性时延。一分钟上手NTTS 安装与使用指南安装与使用都非常简单任选其一方式一pip 直接安装pip install NTTS然后在入口文件里加一行import NTTS即可。方式二克隆最新源码git clone https://gitcode.com/gh_mirrors/ntt/NTTS cd NTTS pip install -e .方式三.pth 自动导入无需写 import将 ntts.pth 拷贝到你的 Python 环境site-packages目录下即可。完整打包配置见 setup.py短短十几行就完成了发布准备也是学习 setuptools 的好范例。结语从 NTTS 源码中学到什么别看这个项目不正经它的实现却浓缩了三个实用知识点sys.excepthook 的全局异常接管、traceback 模块的堆栈格式化能力、装饰器模式对行为的无损扩展。掌握了这套思路你完全可以用它实现更正经的功能——比如统一的错误日志、崩溃邮件上报、或者自定义的美化 Traceback 输出。下一次再有人问为什么你的 CtrlC 输出这么酷你就可以自信地甩出这篇源码解析了【免费下载链接】NTTSNO TIME TO SLEEP项目地址: https://gitcode.com/gh_mirrors/ntt/NTTS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表