我正在 Jupyter notebook 中编写一些代码,但出于某种原因,当我对 notebook 导入的模块进行更改时,它无法识别。
我的 Jupyter notebook 顶部有以下单元格:
%load_ext autoreload
%autoreload 2
基于 this ,我的理解是这个单元将强制模块在笔记本中执行任何代码时重新加载。这意味着如果我编辑我导入的模块之一,那么下次运行代码时应该会反射(reflect)出该编辑。 即使没有这个单元格,我也应该能够重新启动模块并从头开始运行每个单元格以达到相同的效果。不幸的是,这种情况并非如此。无论我终止/重启模块多少次,甚至完全关闭 Jupyter 笔记本,笔记本都不会识别我对相关模块所做的更改。
我在虚拟环境中工作,到目前为止,我找到的唯一解决方案是运行一个完全重建环境的脚本(包括重新下载包等)。这是一种痛苦,而且浪费的时间比必要的要多得多。
这种行为相对较新。我已经在这个环境中使用 Jupyter notebooks 几个月了,没有出现过此类问题,但我无法确定我可能进行了哪些更改以导致出现这种新行为。
如有任何见解,我们将不胜感激。
编辑 - 让我快速说明一下这个问题:
比如说,在一个名为 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
再次感谢您的帮助!
最佳答案
我有类似的问题。我在 How do I make ipython aware of changes made to a selfwritten module? 中找到了答案有效。
这对您的情况也有帮助。根据该答案,在您的上下文中,以下代码应该可以解决您的问题。 (在Python 3中,Python 2也有类似的解决方案,请引用上面的链接)。
import importlib
import foo
from foo import Foo, Bar
foo = importlib.reload(foo)
我不知道为什么魔术命令 %load_ext autoreload
和 %autoreload 2
不起作用。如果有人可以阐明它,那将会很有帮助。
关于python - Jupyter/IPython : After editing a module, 更改即使在内核重启后也无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49541629/