调试友好的堆栈跟踪,具有变量值和语义突出显示

stackprinter的Python项目详细描述


更好的崩溃日志

这将打印带有代码上下文和附近变量值的回溯/调用堆栈。它回答了我向交互式调试器提出的大多数问题:在代码中发生的位置,相关局部变量中的内容,以及为什么用那些参数调用函数的

基本上,这是python内置崩溃消息的一个更有用的版本。它要么打印到控制台,要么给您一个用于日志记录的字符串。

pip install stackprinter

之前
Traceback (most recent call last):
  File "demo.py", line 10, in <module>
    dangerous_function(somelist + anotherlist)
  File "demo.py", line 4, in dangerous_function
    return sorted(blub, key=lambda xs: sum(xs))
  File "demo.py", line 4, in <lambda>
    return sorted(blub, key=lambda xs: sum(xs))
TypeError: unsupported operand type(s) for +: 'int' and 'str'

之后
File demo.py, line 10, in <module>
    8         somelist = [[1,2], [3,4]]
    9         anotherlist = [['5', 6]]
--> 10        dangerous_function(somelist + anotherlist)
    11    except:
    ..................................................
     somelist = [[1, 2], [3, 4]]
     anotherlist = [['5', 6]]
    ..................................................

File demo.py, line 4, in dangerous_function
    3     def dangerous_function(blub):
--> 4         return sorted(blub, key=lambda xs: sum(xs))
    ..................................................
     blub = [[1, 2], [3, 4], ['5', 6]]
    ..................................................

File demo.py, line 4, in <lambda>
    2
    3     def dangerous_function(blub):
--> 4         return sorted(blub, key=lambda xs: sum(xs))
    5
    ..................................................
     xs = ['5', 6]
    ..................................................

TypeError: unsupported operand type(s) for +: 'int' and 'str'

默认情况下,它对屏幕空间有点礼貌(仅显示几行源代码行&函数头,以及这些行中的变量,并且只显示(?)每个变量500个字符)。你可以configure确切地说,事情应该有多冗长。

默认情况下,它输出纯文本,这有利于记录到文本文件。出于某种原因,还有一种颜色模式,您可以在下面的任何函数中通过style关键字激活它。(颜色track different variables而不是语言语法。)

我有时在本地使用它而不是调试器,但当我的代码运行在只有日志文件的地方时(尽管它不是完全成长的error monitoring system),它主要帮助我睡眠。

用法

异常记录

要替换默认的python崩溃打印输出,请在某处调用set_excepthook()。这将为任何未捕获的异常打印详细的stacktrace(默认情况下为stderr)。你也可以make this permanent for your python installation

importstackprinterstackprinter.set_excepthook(style='darkbg2')

要获得更多控制,请在except块内调用^{}^{}show()默认情况下打印到stderr,format()返回一个字符串,用于自定义日志记录。

try:something()except:# print the current exception to stderr:stackprinter.show()# ...or instead, get a string for logging:logger.error(stackprinter.format())

或显式传递特定异常:

try:something()exceptRuntimeErrorasexc:tb=stackprinter.format(exc)logger.error('The front fell off.\n'+tb)

对于所有配置选项,现在,see the docstring of ^{}

还可以将其与标准日志记录调用through a bit of extra plumbing巧妙地集成在一起。

configure_logging() # adds a custom log formatter, see link above
# (...)
try:
    something()
except RuntimeError as e:
    logger.exception('The front fell off.')

打印当前调用堆栈

要查看自己线程的当前调用堆栈,请在异常处理之外的任何地方调用showformat

stackprinter.show()# or format()

打印另一个线程的堆栈

要检查任何其他正在运行的线程的调用堆栈:

thread=threading.Thread(target=something)thread.start()# (...)stackprinter.show(thread)# or format(thread)

跟踪一段代码

更让人好奇的是,您可以看到一段代码一步一步地执行,打印所有调用的跟踪信息,并在调用发生时返回“live”。当然,会让一切都慢下来。

withstackprinter.TracePrinter(style='darkbg2'):dosomething()

tp=stackprinter.TracePrinter(style='darkbg2')tp.enable()dosomething()# (...) +1 million linestp.disable()

使其粘住

要永久替换python安装的崩溃消息,您可以将文件sitecustomize.py放入site-packages目录中由python -c "import site; print(site.PREFIXES)"显示的路径之一下,其内容如下:

# in e.g. some_virtualenv/lib/python3.x/site-packages/sitecustomize.py:importstackprinterstackprinter.set_excepthook(style='darkbg2')

这将给你彩色回溯自动每次,即使在REPL。

(您可以为ipython,but they have their own method执行类似的操作,文件将进入~/.ipython/profile_default/startup,而且我不想讨论这个模块如何在ipython下设置excepthook。)

工作原理

基本上,这是一个帧格式化程序。对于每个frame on the call stack,它都会获取源代码,以找出哪些源代码行引用了哪些变量。然后它在最后执行的行附近显示代码和变量。

由于这已经需要代码中每个变量出现的位置的映射,因此很难不实现屏幕截图中显示的整个语义高亮颜色。颜色现在是ANSI转义代码,但是在没有任何1980年代终端技术的情况下渲染底层数据应该相当简单。比如说,一个可折叠可点击的html页面,其中包含可下载的pickle变量。现在,您必须通过ansi2html或其他方式来传递ansi字符串。

格式和一切都受到了ipython中优秀的^{}的启发。有一天,我想贡献整个“找出localsglobals中的哪些变量在源A中附近”ND打印只有那些“机器在那边,在修剪它的复杂性一点。

注意事项

这将显示格式化时的变量值。在 多线程程序,变量可以在我们忙着走的时候改变 堆栈和打印它们。所以,如果没什么意义的话,考虑一下 您的异常和回溯消息来自稍有不同的时间。 遗憾的是,没有一种负责任的方法可以尽快冻结所有其他线程 因为我们想检查某个线程的调用堆栈(…或者是否存在?)

文档

*咳嗽*

现在,只要看看所有的doc字符串,e.g. those of ^{}

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java IntelliJ找不到依赖项选项卡   java向字符串数组string[]添加元素并在Junit中测试结果   如何在eclipse中获取活动java项目的名称   如何使用java在mysql中插入时间   java ArrayList更新了插入一行,但Jtable仍然没有刷新   如何在JavaSwing中命名坐标(点)   java Matcher/模式不打印   java错误地设置了arraylist   使用UsernamePasswordCredential提供程序的java列表Azure AD   java在HTTP请求中设置UTC时间   未加载事件:jquery完整日历Java集成   java Maven插件依赖项无法从内部repo解析依赖项   Maven更新重置Java版本   java如何向中添加图片。带有Apache POI XWPF的docx,但不指定其大小   Java最大函数递归