Ipython: 在单元格中运行 pdb 后挂起,内核/中断没有帮助

创建于 2017-05-08  ·  34评论  ·  资料来源: ipython/ipython

如果您通过 pdb 调试单元,则在重新运行单元之前不要退出它,您将无法返回到您的 IPython 环境。 通过Test case for pdb hang in Jupyter notebook重现它。 这是一个屏幕截图:

pdb_resists_kernel_interrupt ipynb

对于记录和搜索引擎,挂你的笔记本:

  • 运行以下单元格
  • 不要通过 pdb 提示“退出”
  • 然后再次运行它。
def test():
    import pdb; pdb.set_trace()  # XXX BREAKPOINT
    return 0

test()

请注意,内核/中断没有帮助。 您可以保存笔记本,但要再次运行单元格,您需要重新启动内核,此时“所有变量都将丢失”

如果我在笔记本的其余部分搜索有关如何调试单元的提示,然后在更改单元并再次运行它之前忘记退出,这种情况在我身上并不少见。 是的,我可以更加小心,但其他人也有同样的经历。 感谢@wmayner在#3400 中提供了一个方便的测试用例。

我正在 Python 3.4.3 上运行 Jupyter notebook 4.3.1(默认,2016 年 11 月 17 日,01:08:31)[GCC 4.8.4]
内核信息:Python 3.4.3(默认,2016 年 11 月 17 日,01:08:31)

来自@takluyver 的输入 #10499

pdb 在同一个进程中运行,我们知道它什么时候需要输入。 我认为它需要有人来完成这项工作,以便在前端删除 HTML 输入框时,会将一条消息发送回内核,这将引发 EOFError。
这可能需要一个新的消息类型,或者我们可以将它作为现有标准输入回复消息的元数据字段。

notebook

最有用的评论

刚刚也被这个咬了。 人们通常如何在 jupyter notebook 中进行调试? 使用 pdb 就像玩手榴弹 :(

所有34条评论

我遇到了同样的问题。

绝对,这里也一样。 这是我身体相当敏感的部位的皇家疼痛。 如果存在一种在没有运行单元的情况下停止 pdb 的便捷方法,则可以缓解这种情况。 或者,至少有一种在关闭笔记本之前保存您的工作的方法很重要(例如,经过训练的神经网络和笔记本在 2000 次迭代后在保存时崩溃)。

我也有这个问题,Jupyter 4.30 版,Python 3.6.2。 重新启动内核似乎是处理此问题的唯一方法。

只是失去了8小时计算,由于这个......时间重新开始。

只是失去了一个64数计算上我本来打算今天要呈现结果-.-

没有人找到解决办法吗?

刚刚也被这个咬了。 人们通常如何在 jupyter notebook 中进行调试? 使用 pdb 就像玩手榴弹 :(

请请修复这个! 我不断收到这个问题。

同样在这里。 必须重做一个很长的计算

同样在这里。

有人请修理,我会付给你 5 美元

@zsal如果你是认真的,你可以在https://www.bountysource.com上添加这个问题

同样的问题在这里。 需要一种方法来中断失控的过程或“等待”输入并重新获得控制权的过程......即使我无法再进入输入提示。

我是新手 - 高级程序员究竟是如何在笔记本中调试的? 他们肯定不会使用带有这个“定时炸弹”的 PDB 吗? 请分享你的秘密! :)

+1

+1

+1

+1

向上!
多年来,每当我使用 pdb 并在重新运行单元之前忘记退出时,这个问题一直困扰着我。

我在 BountySource 上创建了一个赏金。 如果我们能筹集到足够的钱,也许这最终会得到解决。
https://www.bountysource.com/issues/44958889-hang-after-running-pdb-in-a-cell-kernel-interrupt-doesn-t-help

+1

+1

这让我疯狂多年。

改用IPython.core.debugger.Pdb怎么样?

from IPython.core.debugger import Pdb; Pdb().set_trace()

(或者%debug魔术可以用于调试。)

运行Pdb().set_trace()两次有同样的问题。

我正在调查此事。 中断工作的基本方式是它们(在 Unix 上)向进程发送信号,然后引发 KeyboardInterrupt。

发生这种情况似乎有多个问题:

  1. SIGINT 不会中断 zeromq。 这有望通过https://github.com/zeromq/pyzmq/pull/1368修复
  2. 即使 zeromq 是可中断的,我相信pdb有一大堆 KeyboardInterrupt 捕获代码可以防止它渗透。 这可能可以在IPython.core.debugger.Pdb
  1. 不准确,zeromq 确实被 SIGINT 中断并引发 KeyboardInterrupt,至少除非 SIGINT 处理程序本身已被覆盖。

@minrk是正确的,我错了,抱歉。

要进行此修复,需要执行以下操作:

非常感谢您对此进行调查!!

只要有新的 IPykernel 版本,就可以将其关闭。

完毕! 这可以关闭。

import IPython
import ipykernel
print(IPython.__version__)
print(ipykernel.__version__)
IPython.core.debugger.set_trace()

7.15.0
5.3.0

``` 250 sys.stdout.flush()
251
--> 252 def __call__(self, result=None):
253 """使用历史缓存管理打印。
254

--键盘中断--
--键盘中断--
``

在我的情况下,KeyboardInterrupt 似乎没有任何作用。 这是预期的行为吗?

我希望这会中断。 我看看能不能复现。 这是 Windows,是吗?

macOS 10.15.5

Python 3.6.2 (default, May  4 2018, 19:40:30)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)] on darwin

哦,所以这不是预期的。 如果有任何信息可以添加以澄清,请告诉我。

点子列表
```包版本


应用 0.1.0
属性 19.3.0
回拨 0.2.0
漂白剂 3.1.5
装饰器 4.4.2
defusedxml 0.6.0
入口点 0.3
ipykernel 5.3.0
ipython 7.15.0
ipython-genutils 0.2.0
ipywidgets 7.5.1
绝地 0.17.1
Jinja2 2.11.2
jsonschema 3.2.0
jupyter 1.0.0
jupyter 客户端 6.1.3
jupyter 控制台 6.1.0
jupyter 核心 4.6.3
标记安全 1.1.1
误调 0.8.4
nbconvert 5.6.1
nbformat 5.0.7
笔记本 6.0.3
包装 20.4
pandocfilters 1.4.2
解析 0.7.0
期待 4.8.0
泡菜共享 0.7.5
点 20.0.2
普罗米修斯客户端 0.8.0
提示工具包 3.0.5
ptyprocess 0.6.0
Pygments 2.6.1
pyparsing 2.4.7
强烈的 0.16.0
python-dateutil 2.8.1
pyzmq 19.0.1
qtconsole 4.7.5
QtPy 1.9.0
Send2Trash 1.5.0
设置工具 46.0.0
六 1.15.0
终点站 0.8.3
测试路径 0.4.4
龙卷风 6.0.4
特质 4.3.3
宽度 0.2.5
网络编码 0.5.1
车轮 0.34.2
小部件nbextension 3.5.1```

对我来说,更新后问题也仍然存在。 同样在我用于工作的远程 linux 计算节点上,请参阅:

import IPython
import ipykernel
import os
import platform

print(IPython.__version__)
print(ipykernel.__version__)
print(os.name,platform.system(),platform.release())
IPython.core.debugger.set_trace()

7.15.0
5.3.0
posix Linux 4.19.94-300.el7.x86_64

目前在一个相当庞大的环境中工作,所以不能排除某些依赖可能导致它? 如果有用,我可以尝试查看错误是否也在最小环境中重现?

这需要尚未发布的 IPykernel 大师。

此页面是否有帮助?
0 / 5 - 0 等级