jupyter kernel_Jupyter填补IDE空白,发布可视化调试器

8ada134d20b1cb91f958427d8c924715.gif

1

Jupyter填补IDE空白

快速查看执行结果和迭代的能力是Jupyter成功的主要原因之一。Jupyter用户喜欢在note book上做实验,并把note book作为一种互动交流工具。但是,对于更经典的软件开发任务,例如重构大型代码库,它们通常会切换到通用的IDE。

ce0b0d6645edd2c6e405514da17d83f9.png

在过去的几年中,Jupyter项目在填补这一空白方面取得了长足的进步,特别是在JupyterLab项目中,该项目实现了更丰富的UI,包括文件浏览器,文本编辑器,控制台,笔记本和丰富的布局系统。但是,缺少的部分(这仍然是用户切换到其他工具的主要原因之一)是可视化调试器。长期以来,用户一直要求此功能,特别是那些习惯于通用开发环境的用户。 经过几个月的开发,Jupyter今天终于宣布可视化调试器的第一个公开发行版 ! 这只是第一个版本,但是我们已经可以在笔记本单元和源文件中设置断点,检查变量,导航调用堆栈等等。

555922710c5ab41cb67d28dd4a29aade.png

2

binder上尝试调试器

197dccd2482788965ae6b0eed865b3ba.png

您还可以使用binder在线尝试调试器。 调试器前端可以作为JupyterLab扩展安装。 c31538dc03845e3d8262cfd3a84b68cf.png 在后端,需要一个实现Jupyter调试协议(将在下一部分中详细介绍)的内核。到目前为止,唯一实现此协议的内核是xeus-python,这是用于Python编程语言的新Jupyter内核。(路线图中也支持ipykernel中的调试器协议)。 344cb015460abab1e986b8c36942893d.png 一旦安装了xeus-python和debugger扩展,就全部设置为使用Jupyter可视调试器! 注意:视平台而定,PyPI wheels 可用于xeus-python,但仍处于试验阶段。 3

Jupyter调试协议

Jupyter内核(执行用户代码的基础结构的一部分)与内核中的其余部分通过指定的进程间通信协议进行通信。 存在几种沟通渠道,例如:
  • Shell通道,这是一个请求/回复通道,例如执行请求
  • IOPub通道是从内核到客户端的单向通信通道,例如用于转发标准输出流(stdout和stderr)的内容。
Control通道类似于Shell,但在单独的socket上运行,因此消息不会在执行请求之后排队,并且具有更高的优先级。Control已用于中断和关机请求,我们决定对发送到调试器的命令使用相同的通道。 协议中添加了两种消息类型
  • debug_ [request / reply]请求由调试器执行的特定操作,例如添加断点或单步执行到代码中,然后发送到控制通道。
  • 调试内核用于将调试事件发送到前端的debug_event单向消息。调试事件通过IOPub通道发送。
4

扩展的调试适配器协议(DAP)

Jupyter设计的关键原则是对编程语言的不可知论性。Jupyter调试协议必须适应其他内核实现,这一点很重要。 流行的调试标准是Microsoft的“调试适配器协议”(DAP) ,它是Visual Studio Code调试器的基础,基于JSON的协议,并且已经存在多种语言的后端。 但是,对于Jupyter而言,这还不够:
  • 为了支持页面重新加载或客户端在以后的连接,Jupyter内核必须存储调试器的状态(断点,调试器当前是否停止)。前端可以通过debug_request消息来请求该状态
  • 为了支持不基于源文件的笔记本单元和Jupyter控制台的调试,还需要消息将代码提交到调试器,并可以在其中添加断点。
除了这两个区别外,调试请求和答复的内容还与调试适配器协议相对应。 5

第一个支持调试的Jupyter内核

Xeus-python,第一个支持调试的Jupyter内核

Xeus是Jupyter内核协议的C ++实现。它本身不是内核,而是有助于内核创作的库。当为具有C或C ++ API(例如Python,Lua或SQL)的语言开发内核时,Xeus很有用。内核作者需要执行繁琐的任务来实现Jupyter消息传递协议,以专注于核心解释器任务:执行代码,检查等。

基于CERN的cling C ++解释器,已经使用xeus开发了几种内核,包括流行的针对C ++编程语言的xeus-cling内核。xeus-python内核是基于xeus的ipykernel的替代Python内核。xeus-python内核的第一个版本已于今年早些时候在此博客上宣布:

https://blog.jupyter.org/a-new-python-kernel-for-jupyter-fcdf211e30a8

Xeus-python是调试协议第一个实现的合适选择,因为

  • 它具有可插入的并发模型,该模型允许在其他线程中运行Control通道的处理。

  • 它具有较轻的代码库,使其成为方便的迭代沙箱。在ipykernel中实施协议的第一版将需要在早期阶段进行更重要的重构和共识。

xeus-python的短期路线图包括

  • 在xeus-python中添加了对IPython魔术的支持,这是ipykernel缺少的主要功能。

  • 改进xeus-python的PyPI wheels。

6

深入调试器前端架构

JupyterLab的调试器扩展提供了用户通常对IDE的期望:

  • 带有变量浏览器的边栏,断点列表,源预览以及浏览调用堆栈的可能性

  • 直接在代码旁边(即在代码单元和代码控制台中)设置断点的能力

  • 视觉标记,指示当前执行已停止的位置

使用Jupyter笔记本时,执行状态保存在内核中。但是可以执行一个单元,然后将其从note book中删除。当用户想要插入已删除的代码时该怎么办?

该扩展支持该特定用例,并能够检索以前执行的单元格的只读视图。

a3a528d4a054185fd35d346ba17b0cc3.png

控制台和文件也支持调试。

955065dfd395160c03f6bbe77a7c7a97.png

bed47588330b2a1d8a500ab8fcfde346.png

可以在notebook级别上启用调试,这使用户可以调试notebook并同时在另一个notebook上工作。

68f997e399b3d44370c1c4d4838ca669.png

可以使用树查看器和表查看器检查变量:

d36bed1c88b158f97d6c533ca5b22a9b.png

JupyterLab的调试器扩展旨在与支持调试的任何内核一起使用。

通过依赖于调试适配器协议,调试器扩展可以抽象出特定于语言的功能,并为用户提供一致的调试界面。下图显示了调试会话期间,调试消息如何在用户,JupyterLab扩展和内核之间流动。

3003ed4ced6de648976f893012e616e8.png

7

未来展望

计划在2020年对调试器的体验进行重大改进:

  • 在变量资源管理器中支持丰富的mime类型呈现。

  • 在UI中支持条件断点。

  • 调试器用户体验的总体改进。

  • 从JupyterLabVoilà预览扩展启用Voilà仪表板的调试。

潮水自会来去,但心志得坚若磐石。即便成不了那根定海神针,也至少不是那随意被拍上岸的野鬼游魂。 

944593795025641dd28ce33772927313.png 长按关注 "AI深度视线"
最新人工智能、深度学习、计算机视觉干货奉上!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值