Ipython: 笔记本中的“全部运行”挂在 %matplotlib qt 上

创建于 2014-04-16  ·  39评论  ·  资料来源: ipython/ipython

这是一个奇怪的错误,但它似乎可以跨系统重现。

如果我有第一个单元格所在的笔记本

%matplotlib qt

我选择“全部运行”,IPython 执行第一个单元格,然后挂起。 右上角的状态图标是一个空心圆圈,但我无法运行任何其他单元格。 如果我在%matplotlib行之后添加一个简单的打印语句,它将被执行并打印到输出区域。

如果我“手动”执行单元格,则不会发生这种情况。 一旦发生这种情况,我可以毫无问题地选择“全部运行”。

OSX 10.6 和 10.8 上的 IPyhton 2.0 都会发生这种情况。 我正在通过 anaconda 使用 Python 2.7。

很高兴尝试任何事情来进一步追踪这一点......

bug matplotlib

最有用的评论

这个问题也发生在%gui qt魔法上,虽然我认为它会在某些情况下尝试导入 matplotlib,所以我不确定。

所有39条评论

我注意到从 Windows 上的 miniconda 安装 Python 2.7 也有类似的事情。 当我有第一个单元格所在的笔记本时:

%pylab

即使在手动运行该特定单元后,“全部运行”也将始终挂起。 在此之后,我必须 Kernel->Restart 才能让笔记本响应任何事情。 我的解决方法是手动运行该单元格,移动到下一个单元格,然后“运行所有下面”。

我也很高兴提供更多信息以帮助进一步追踪。

我也可以确认这一点(如果您的第一个单元格同时包含%matplotlib和一些导入(需要一些时间来执行),并且您想与下一个单元格一起执行它,这会很烦人)。

重现这一点的简单方法:

  1. 有两个单元格的笔记本:

%matplotlib import time time.sleep(10)

print "This will not print"

  1. 一次执行(按 shift-enter 两次)
  2. 第一个单元将执行,但随后内核挂起(第二个单元未执行,您无法执行任何操作,尽管指示器表示内核已准备就绪)。

untitled

所以它不一定与“全部运行”有关,而只是与执行多个单元格有关,其中一个单元格具有%matplotlib

最后使用 IPython 2.1、Windows 64 位、Firefox 31 对其进行了测试

经过更多的实验,我发现这个问题首先出现在 2.0.0 版本中。 如果我回滚到版本 1.2.1

conda install ipython=1.2.1

问题就解决了。

Windows 32 位,python 2.7.7,Firefox 31

我也遇到了这个错误,可以使用上述方法在 Windows 8 上使用 Python 3.4.1、Anaconda 2.1.0(64 位)、IPython 2.3.1 重现
这是一个非常烦人的错误。 我能做些什么来帮助追踪它吗? 4.0 里程碑(大致)预计何时完成?

我在 Linux Mint 17、python 3.4 和 matplotlib 1.4.0 上使用来自 github 的最新 ipython 版本(e2778c5f4047d03f5f025bd53d1704a0cf9f0337)确认了该错误。

有这家伙的消息吗? 如果需要,我可以做更多的测试。 这个bug真的很烦!!!

我可以确认这也发生在我身上,在带有 python 2.7 和 matplotlib 1.4.4 的 CentOS 上一直发生

如果您手动运行单元格,它会起作用吗?

请参阅我上面的评论(https://github.com/ipython/ipython/issues/5629#issuecomment-50603511),如果您手动运行多个单元格,它也会出现

是的 - 我相信这基本上是一个时间问题。 如果您 Shift+Enter 运行单元格,然后等待一秒钟,然后继续其他单元格,则它可以工作。 如果您反复按 Shift+Enter 多次,它就会挂起。 运行更多单元格不会导致任何代码实际运行(也就是右上角的小圆圈仍然是空的)。

^ 这也是我观察到的。

在 Ipython Notebook 3.1.0 中验证。 解决方法:

import time
%matplotlib
time.sleep(1)

丑,但是放弃全部运行的选项太烦人了。

我也让它在我的机器上工作。

在周五,2015年6月12日在上午07时02分,quicknir [email protected]写道:

在 Ipython Notebook 3.1.0 中验证。 解决方法:

导入时间
%matplotlib
时间.睡眠(1)

丑,但是放弃全部运行的选项太烦人了。


直接回复此邮件或在 GitHub 上查看
https://github.com/ipython/ipython/issues/5629#issuecomment -111502934。

我们能否在 4.1(或 5.0)上实现这一里程碑?
挂笔记本听起来(对我来说)比心愿单里程碑更严重。 此外,这个错误在使用 matplotlib 时很烦人(尽管有解决方法)。

我们是否应该在 matplotlib 魔术本身中使用sleep(1)作为解决方法,直到我们弄清楚原因?

:+1:

睡眠解决方法很少对我有用。 我已经看到它工作了几次,但我尝试过的绝大多数时候,笔记本仍然挂起。

唯一对我有用的解决方法是:

  1. 手动运行包含 %matplotlib 的单元格
  2. 等待内核空闲指示
  3. 选择以下单元格
  4. “在下面运行所有”

FWIW 我试图对此进行一些测试,以更合理地估计其效果如何。

我用以下三个单元制作了一个笔记本:

import time
%matplotlib qt
time.sleep(1)
with open("test_log.txt", "a") as fid:
    fid.write("it worked\n")

然后在 shell 中运行:

for i in {1..100}; do
    ipython nbconvert --execute test_qt.ipynb  --inplace;
done
wc -l test_log.txt

也许这个测试没有使用正确的代码,但它似乎工作正常。

标记为4.1所以我们看一下。

谢谢你。
我刚刚尝试了@mwaskom的重现,我得到了相同的结果。 但是,然后我撕掉了时间和睡眠代码,并再次运行了外壳部分,它_也_起作用了! 因此,这似乎不是一个好的重现程序(或内部解决方法)。 :-/
我还发现,像@tanderl一样, sleep 解决方法对我并不总是有效。 这是在 64 位 Ubuntu 上的 ipython 3.2.1 上。 明天我可以在 Windows 上尝试同样的事情。

在 Windows 8.1 上,使用通过 Anaconda 安装的 Ipython 3.2.0,我还发现 sleep 解决方法对我不起作用,即在与 matplotlib 魔术相同的单元格中使用sleep(1) (甚至更大的值),运行新重新启动的内核上的所有内容仍将挂起(或什么也不做,UI 仍然有效),并在下一个单元格上带有星号。 一个接一个地手动运行单元格,中间等待,仍然有效。

我用 Linux Mint 上更新的 anaconda 堆栈确认了@bilderbuchi所说的话。

你好,
我刚刚遇到了类似的问题。 当运行使用 %matplotlib 内联或笔记本魔法的笔记本时,“运行所有单元格”有时会挂起,我必须手动运行所有单元格。
我正在运行 Windows 7、Python 3.5、IPython 5.1.0、笔记本 4.1.0 和 matplotlib 1.5.3。
作为一种解决方法,我清理了所有输出,然后它似乎可以工作。 不幸的是,我无法提供可复制的笔记本(如果我将来遇到这种情况会这样做)。

此致,
弗洛里安

这在 jupyter notebook 和 lab 中仍然存在问题。

@thomasaarholt你有可靠的复制程序吗?

@bilderbuchi看到这个问题的原帖,它仍然是同样的问题。 这是我在我的机器上重新创建的 GIF(OSX w/最新的 jupyter 和 qt4)

bug

@Carreau ,那个

@bilderbuchi @Carreau ,我刚刚发现了愿望清单标签。
我想证明这个错误应该有更高的优先级:

许多新的 jupyter 用户将通过预先存在的笔记本学习使用 jupyter。 例如,他们尝试运行某个插件提供的示例工作簿。 对于当前的行为,用户使用“全部运行”命令或“Shift + Enter”快速浏览笔记本会发现笔记本从一开始就挂起,这给人的第一印象非常差。 对于第一次学习编码的人,或者过去有过糟糕经历(课堂/考试)的人,这样的印象通常可以真正强调“编码的复杂性”。

我想证明这个错误应该有更高的优先级:

嗯,这不再是优先级的问题了,这个 bug 已经开放了 2 年多,问题是没人能弄明白。 我们确实试图解决这个问题,但这似乎是一个难以捉摸的解决方案,而且我们无法成为所有框架事件循环和库的专家。 我们很乐意做点什么,但这个问题已经存在了很长时间,将其标记为更高的优先级也无济于事。 没有一个开发人员知道发生了什么。 否则我们会修复它。

@Carreau你能指出 ipython 代码中内核服务器和 GUI 之间的集成应该发生的地方吗?

有没有办法在浏览器中以编程方式打开笔记本并运行所有单元格? 这可能使我们能够 git 平分代码来确定导致这种情况的更改。
我曾尝试从终端和 IPython 会话中通过nbconvert --execute执行有问题的笔记本,但到目前为止无法让它挂起。

@bilderbuchi首先,您能否在您的机器上“手动”重现该错误?

是的。 我发现了一些有趣的行为尝试不同的魔法变体
第一个单元格内容:

%matplotlib notebook -> works
%matplotlib inline -> works
%matplotlib -> prints Using matplotlib backend: Qt5Agg, then hangs
%matplotlib qt -> prints ModuleNotFoundError: No module named 'PyQt4' (I think that's a different unrelated bug)
%matplotlib qt5 -> prints nothing, then hangs

(我认为执行%matplotlib qt时的不同错误是 ContinuumIO/anaconda-issues#1068。)
第二个单元格只有

print("This will not print")

如果我在上面说“挂起”,我的意思是第二个单元格的数字中总是有一个星号而不是“2”,并且消息永远不会被打印出来。
所有这些都是通过 Kernel - Restart & Run All 执行的,以确保干净利落。 这是在 Python 3.6.1 上通过 Windows 10、IPython 5.3.0、Firefox 52.0.2 上的 Anaconda。

你能指出 ipython 代码中内核服务器和 GUI 之间的集成应该发生的地方吗?

这里描述了事件循环集成如何工作: http ://ipython.readthedocs.io/en/stable/config/eventloops.html#event -loops-in-the-kernel

Qt 5 事件循环的代码从这里开始: https :

只是为了检查 - 问题肯定是%matplotlib的“matplotlib”部分,而不是一般的魔法? 以防万一其他魔法需要更少的时间运行,所以这个错误不太明显。

这个问题也发生在%gui qt魔法上,虽然我认为它会在某些情况下尝试导入 matplotlib,所以我不确定。

这与 matplotlib 或魔法无关(直接)。 当从一个运行节目的事件循环切换到另一个事件循环时,这几乎可以肯定是一种竞争条件。

我的猜测是这里需要对https://github.com/ipython/ipython/pull/10301/files进行类似的修复。

更新 Spyder 后我遇到了类似的问题

我可以确认 %gui qt 仍在发生这种情况。 我有一堆从笔记本调用的 Qt 东西,在这些笔记本中,我必须手动运行我的第一个单元,等待它完成,然后运行下面的所有内容。

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