【问题标题】:Jupyter / IPython: After editing a module, changes are not effective even with kernel restartJupyter / IPython:编辑模块后,即使重新启动内核,更改也无效
【发布时间】:2018-09-07 13:25:16
【问题描述】:

我正在 Jupyter 笔记本中编写一些代码,但由于某种原因,它无法识别我何时对笔记本导入的模块进行了更改。

我的 Jupyter 笔记本顶部有以下单元格:

%load_ext autoreload
%autoreload 2

基于this,我的理解是,此单元格将在笔记本中执行任何代码时强制模块重新加载。这意味着如果我编辑其中一个导入的模块,则下次运行代码时应该会反映该编辑。 即使没有这个单元,我也应该能够重新启动模块并从头开始运行每个单元以达到相同的效果。不幸的是,这种情况并非如此。无论我杀死/重新启动模块多少次,甚至完全关闭 Jupyter 笔记本,笔记本都不会识别我对相关模块所​​做的更改。

我在虚拟环境中工作,到目前为止,我发现的唯一解决方案是运行一个完全重建环境的脚本(包括重新下载包等)。这是一种痛苦,而且浪费的时间比应有的要大得多。

这种行为相对较新。我已经在这个环境中使用 Jupyter 笔记本几个月了,没有出现这样的问题,但我无法确定我可能改变了什么来导致这种新行为。

任何见解将不胜感激。

编辑 - 让我快速说明这样一个问题:

比如说,在一个名为 foo.py 的模块中,我有一个类:

class Foo(object):
    foo_bool = True

在我的笔记本中,我有单元格:

from foo import Foo

然后我添加到foo.py

class Foo(object):
    foo_bool = True


class Bar(object):
    bar_bool = False

我现在想导入这两个类,所以我将笔记本单元格更改为:

from foo import Foo, Bar

我没有正确导入这两个类,而是得到如下内容:

---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-2-1d0ce6099263> in <module>()
      1 import some_module
      2 import some_other_module
----> 3 from foo import Foo, Bar
      4 from yet_another_module import Thing
      5 from the_last_module import TheLastThing

ImportError: cannot import name Bar

再次感谢您的帮助!

【问题讨论】:

  • 你最终解决了这个问题吗?我现在也在苦苦挣扎..

标签: python jupyter-notebook


【解决方案1】:

我也有类似的问题。我在How do I make ipython aware of changes made to a selfwritten module?works 中找到了答案。

这对您的情况也有帮助。根据该答案,在您的上下文中,以下代码应该可以解决您的问题。 (在 Python 3 中。Python 2 也有类似的解决方案。请参考上面的链接)。

import importlib
import foo
from foo import Foo, Bar

foo = importlib.reload(foo)

我不知道为什么魔术命令 %load_ext autoreload%autoreload 2 不起作用。如果有人可以阐明它,那将很有帮助。

【讨论】:

  • 我相信我已经解释了魔术命令在我的答案中不起作用的原因。
【解决方案2】:

尝试使用--editable 标志安装您的软件包,

pip install --editable <your-package>
# or
pip install --editable .

您遇到的问题可能是由于您使用pip install &lt;your-package&gt;pip install . 安装模块所致。这将始终生成源代码的副本并将其移动到 pip 安装目录。无论您导入此模块多少次,它始终会引用您安装它时代码的相同“快照”。

如果您改为使用pip install --editable &lt;your-package&gt;pip install --editable . 来安装您的软件包,您的源代码的pip 安装将引用您进行安装的实际 目录。当您在那里更改代码时,它应该正确反映在您的笔记本中(假设您仍在使用魔法命令;否则您需要使用 importlib 或重新启动内核以重新导入模块)

%load_ext autoreload
%autoreload 2

【讨论】:

    【解决方案3】:

    我认为发生的情况是,一旦您通过运行 setup.py (ref here) 安装了一个包,您的 python 解释器将不再查看源代码,因为它会很容易地编译它。当您运行安装程序时,您将可以使用任何版本的代码。

    这更像是一个 python 问题,而不是 Jupyter 问题,您需要重新运行安装程序才能更新代码中可用的任何内容。这至少为我解决了问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 2023-02-20
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      相关资源
      最近更新 更多