神器 Jupyter 的可视化 Debug!
来源丨网络
Python 代码编辑器怎么选?PyCharm、VS Code、Jupyter Notebook 都各有特色,Jupyter 适合做数据分析这些需要可视化的操作,PyCharm 更适合做完整的 Python 项目。
然而,因为交互式操作,很少会有开发者想到用 Jupyter 做 Debug。
尽管很多读者可能认为 Jupyter 用来做展示和小型试验就足够了,Debug 并没有太大的需求,但弥补上 Jupyter 缺失的一环,能让它更好用,未来 Debug 也会作为默认模式。
为什么 Jupyter 需要 Debug?
Jupyter 这种工具虽然有很好的交互性能,但其也明白,对于大型代码库,最好还是用传统的 IDE 比较靠谱。
因此为了弥补这一缺陷,Jupyter 项目在过去几年也希望通过 JupyterLab 来加强对大型代码库的处理过程。
然而,JupyterLab 还是有一大缺陷,它不能通过可视化的方式进行 Debug,这限制了进一步的调试。这几天,Jupyter 团队表示,经过几个月的开发,他们很高兴能第一次发布 Jupyter 可视化 Debugger。
![](https://filescdn.proginn.com/935ccee9c4684977471c2774604306bd/466f982c86e47a643a0d802e18e6fc2d.webp)
虽然这只是第一版,但目前已经可以设置常见的断点 Debug,查看各种变量、执行模块等信息。
新工具的用法也很简单,很常见的 Debug 方式差不多。如果读者想要安装这个新工具,那么首先你需要为 JupyterLab 装前端插件:
jupyter labextension install @jupyterlab/debugger
至于后端 Kernel,Jupyter 团队表示目前 kernel 需要实现 Jupyter Debug Protocol,因此暂时只能用xeus-python:
conda install xeus-python -c conda-forge
只要装好前端与后端,我们就可以直接使用了。开发者还提供了 Debug 的线上体验版,不需要安装任何东西就能体验。
在线 Debug 环境:
https://hub.gke.mybinder.org/user/jupyterlab-debugger-hwxovlw4/lab/tree/examples/index.ipynb
Xeus-python
第一个支持 Jupyter Debug 的内核
Xeus 是 Jupyter kernel protocol 的 C++实现,它本身并不是一个内核,而是能帮助构建内核的库。当开发者希望构建 Python、Lua 等拥有 C、C++ API 的语言内核时,它非常有用。
目前已经有一些内核使用 xeus 进行开发,Xeus-python 内核是我们做 Python 开发时可选的一个内核,它去年就已经有发布。Xeus-python 之所以被 Jupyter 团队选为第一个实现 Debug 的内核,主要是它有以下两大优势:
Xeus-python 具有可插拔的并发模型,它允许在不同的线程中运行 Control channel 的处理过程; Xeus-python 有非常轻量级的代码库,因此迭代与更新都非常方便。
短期内,xeus-python 还会有进一步提升的计划,例如添加 Ipython 魔术方法,优化 xeus-python 的 PyPI 等。
深入至 debugger 的前端架构
JupyterLab 的 debugger 扩展针对用户对 IDE 的使用习惯提供了通常性功能:
带有资源管理器的侧边栏,无序列表,源预览以及允许导航至调用堆栈 可直接在代码旁(即在代码单元以及代码控制台中)设置断点的功能 可视化的标记,指示当前执行停止的位置
当使用 Jupyter 笔记本时,执行的状态保存在内核中。但是如果我们执行了一个 cell,然后又把整个 cell 删了,那么用户在 Dubug 的时候希望运行到那些代码又怎么办?
如下动图所示,该插件支持特定用例,并能在只读模式下查看以前执行过的 cell。
![](https://filescdn.proginn.com/f5023ab6cffece92a5957f52cb273aab/a6237082839fd16870fe45b76432960e.webp)
![](https://filescdn.proginn.com/c07b0a238982b72c1b1efecc298eed9b/5b081a0a8620ad446b9925c9f8a6725f.webp)
![](https://filescdn.proginn.com/8e6ca1e23f36d7d4aab03aa36bd7f542/f0d61d98726a4ada9ee07f0d629186a6.webp)
可以在 notebook 级别上启用调试,用户可以在调试 notebook 的同时在另一个 notebook 上工作。
![](https://filescdn.proginn.com/e828aa7bc049c0aee2460fe090f8a039/66296448f52580880e7e535c0cafe786.webp)
可以使用树状查看器和表状查看器检查变量:
![](https://filescdn.proginn.com/f8c94fba5824aaa339cfd0a1e838aaab/db57c7bd30b1ca8dbe0e12266008552e.webp)
JupyterLab 的 debugger 插件目标是与任何支持调试内核一并使用。通过 Debug Adapter Protocol,debugger 插件可以抽象出针对于特定语言的功能,并为用户提供匹配的调试界面。
并且团队计划在 2020 年对 debugger 的体验进行重大改进,例如在变量浏览器中支持丰富的渲染,在 UI 中支持条件断点。
VS Code 可视化 Debug 工具
Debug 是条漫漫长路,不久前介绍过一款 VS Code 实时可视化 debug 工具,在此也可以作为参考。以一种更优雅、更简洁的 debug 方式帮用户找到代码问题所在是未来优化的方向之一,而之前所介绍这款可视化 debug 能够快速展示数据结构。
![](https://filescdn.proginn.com/b5125dc6b8e630fa13ecb278a168f324/5c05329e912b2bd58f246345edaa9946.webp)
从效果层面上看此款工具更加惊艳,而且跟以往传统 debug 方式的展示形式完全不同,比如将断点设置为第 32 行定义双向链表,随后一行行运行代码就会在右图展现出对应的数据结构图。
![](https://filescdn.proginn.com/833a2cec3144d3d4bcb43953d035fdb1/c40c0d0f2e50e96d59b0746f0aa8cdbe.webp)
同时也会根据数据结构以不同的方式展现,例如树形、表格、曲线和图等。
![](https://filescdn.proginn.com/9dc27c4bc1bf7005a41e0e0d53888da8/4de69231621090b0ced0892b6b34204f.webp)
同时还内置了其他可自定义的可视化调节器,可以根据面对不同的处理对象,可选择更易于理解的可视化方式。比如图表可视化,Plotly 可视化,Tree 可视化,网格可视化,文本可视化等等。
![](https://filescdn.proginn.com/7fafbdc775ae5ac0d4734e0275e8a3fd/dbfb9868a5277d3d284657f3de100987.webp)
![](https://filescdn.proginn.com/ea6c18f83ab0689a8628b5b28801151f/6fa7fee40e132ee784eb19aecbe36229.webp)
不过这款 VS Code 的 debug 工具开发者正在探讨其对 Python 的支持,而对于 Python 的完美支持会使得该项目更加便捷且适用。
而对于 debug 来说,不管最终是采用的是 print() 大法,或是善用 assert 语句,亦或是以直接设置断点,包括各种新推出的 debug 工具。单从辅助工具角度层面看,只要它能够提高工作效率,不管是哪款 debug 工具,找到适合你的那便是值得一试。
参考链接:
https://blog.jupyter.org/a-visual-debugger-for-jupyter-914e61716559
https://www.reddit.com/r/MachineLearning/comments/foum00/n_jupyter_visual_debugger/