ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

调试别人的 Typer 程序时怎么用 TYPER_STANDARD_TRACEBACK=1 拿到完整 traceback?

调试别人的 Typer 程序时怎么用 TYPER_STANDARD_TRACEBACK=1 拿到完整 traceback? 调试别人的 Typer 程序时怎么用 TYPER_STANDARD_TRACEBACK1 拿到完整 traceback【免费下载链接】typerTyper, build great CLIs. Easy to code. Based on Python type hints.项目地址: https://gitcode.com/GitHub_Trending/ty/typer运行一个出了错的 Typer 命令行程序时你默认看到的不是完整的 Python traceback而是 Typer 用 Rich 渲染过的“精简版”所有来自 Typer 和 click 内部文件的调用帧都被省略只剩你自己代码里的几行。对自己的程序这没问题但调试别人写的 Typer 程序时精简输出往往不足以让你看清错误经过了哪条内部调用路径而你又不能改人家的源码去加pretty_exceptions_enableFalse。Typer 为此提供了环境变量TYPER_STANDARD_TRACEBACK1在运行程序前在 shell 里设置它程序就会打印完整的标准 Python traceback。docs/tutorial/exceptions.md 中明确写道这种方式 “will work for any other Typer program too, in case you need to debug a problem in a Typer program made by someone else”对其他任何 Typer 程序都有效比如你要调试别人写的 Typer 程序时。默认输出是什么样的为什么不够用Typer 在捕获到未处理异常时会自动使用 Rich 美化输出并省略 traceback 中来自 Typer 内部的部分让错误更清晰。以文档给出的示例损坏程序 docs_src/exceptions/tutorial001_py310.py 为例它执行print(name 3)字符串加整数必然抛出TypeErrorimport typer app typer.Typer() app.command() def main(name: str morty): print(name 3) if __name__ __main__: app()直接运行uv run python main.py时默认输出是文档示例╭──────────── Traceback (most recent call last) ────────────╮ │ /home/user/code/superapp/main.py:8 in main │ │ │ │ 5 │ │ 6 app.command() │ │ 7 def main(name: str morty): │ │ ❱ 8 │ print(name 3) │ ╰──────────────────────────────────────────────────────────╯ TypeError: can only concatenate str (not int) to str这里只有main.py一帧调用异常的那条typer/main.py → click/core.py → ...链路完全看不到。另外从 Typer 0.23.0 起默认也不再展示局部变量值避免在 CI 日志中泄露密码、密钥或 token要看局部变量需要改源码创建应用时传pretty_exceptions_show_localsTrue——对别人的程序这条路走不通所以用环境变量。设置 TYPER_STANDARD_TRACEBACK1 并运行程序前提目标程序是一个 Typer 程序内部使用typer.Typer()且没有自己设置pretty_exceptions_enableFalse若已设置输出本来就是标准 traceback见下文“适用边界”。按文档示例在 shell 中先导出变量再运行程序以下命令即文档原文export TYPER_STANDARD_TRACEBACK1 uv run python main.py要点变量在启动程序之前设置。它由 Typer 的全局异常钩子在打印异常时读取typer/main.py 中的except_hook读取TYPER_STANDARD_TRACEBACK找不到时回退到已弃用的_TYPER_STANDARD_TRACEBACK只要该值非空就跳过 Rich 美化逻辑直接交给 Python 默认的sys.excepthook打印完整 traceback。该机制与应用创建参数无关因此对无法修改的第三方 Typer 程序同样生效。怎么确认拿到的是完整 traceback设置变量后输出变成标准 Python 格式的 traceback。下面是文档示例输出其中的路径来自文档示例环境Traceback (most recent call last): File main.py, line 12, in module app() File /home/user/code/superapp/env/lib/python3.7/site-packages/typer/main.py, line 328, in __call__ raise e File /home/user/code/superapp/env/lib/python3.7/site-packages/typer/main.py, line 311, in __call__ return get_command(self)(*args, **kwargs) File /home/user/code/superapp/env/lib/python3.7/site-packages/click/core.py, line 1130, in __call__ return self.main(*args, **kwargs) File /home/user/code/superapp/env/lib/python3.7/site-packages/typer/core.py, line 723, in main **extra, ... File /home/user/code/superapp/env/lib/python3.7/site-packages/typer/main.py, line 683, in wrapper return callback(**use_params) # type: ignore File main.py, line 8, in main print(name 3) TypeError: can only concatenate str (not int) to str判断是否生效看三点输出是 Python 默认的Traceback (most recent call last):纯文本格式不再是 Rich 的带边框盒子帧列表中出现了typer/main.py、typer/core.py、click/core.py等内部文件调用链完整直到程序自身的错误行print(name 3)最后的异常类型与消息和精简版一致例如TypeError: can only concatenate str (not int) to str。这些判断点在本仓库测试中是可直接核对的tests/test_tutorial/test_exceptions/test_tutorial002.py 的test_standard_traceback_env_var用TYPER_STANDARD_TRACEBACK1以及_TYPER_STANDARD_TRACEBACK1分别运行示例程序断言 stderr 中包含return get_command(self)(*args, **kwargs)、app()、print(name 3)和该TypeError消息同时断言不包含name morty即标准 traceback 里不会出现 Rich 的 locals 变量块。适用边界与注意事项能改源码时的等价做法如果你可以修改程序创建应用时传pretty_exceptions_enableFalse效果相同输出同样是完整标准 traceback见 docs_src/exceptions/tutorial004_py310.py。环境变量正是为“不能改源码”的场景调试别人的程序提供的。_TYPER_STANDARD_TRACEBACK1是已弃用的旧变量文档建议统一使用TYPER_STANDARD_TRACEBACK。标准 traceback 不显示局部变量值上面测试已证明开启该变量后 stderr 中不会出现name morty这类内容。若排障时需要局部变量值只能改源码创建typer.Typer(pretty_exceptions_show_localsTrue)文档建议仅在确认不涉及敏感信息时使用这不是环境变量能解决的。变量为空或不设置时不生效仓库测试在验证默认行为时会把TYPER_STANDARD_TRACEBACK和_TYPER_STANDARD_TRACEBACK显式置为空字符串以确认默认输出仍是精简格式见 tests/test_tracebacks.py即只有非空值才会触发标准 traceback。调试完成后若不想影响后续运行可在当前 shell 中取消导出如unset TYPER_STANDARD_TRACEBACK或换一个新终端让程序回到默认的 Rich 精简输出。【免费下载链接】typerTyper, build great CLIs. Easy to code. Based on Python type hints.项目地址: https://gitcode.com/GitHub_Trending/ty/typer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表