我在Jupyter笔记本中编写了一些代码,但由于某种原因,当我对笔记本导入的模块进行了更改时,它无法识别。
我的Jupyter笔记本顶部有以下单元格:
%load_ext autoreload
%autoreload 2
基于this,我的理解是,此单元将强制模块在执行notebook中的任何代码时重新加载。这意味着如果我编辑我导入的模块之一,编辑应该在我下次运行代码时反映出来。即使没有这个单元,我也应该能够重新启动模块并从头开始运行每个单元,以达到相同的效果。不幸的是,事实并非如此。无论我关闭/重新启动模块多少次,甚至完全关闭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
现在我想导入这两个类,所以我将notebook单元格更改为:
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
再次感谢你的帮助!
发布于 2019-11-08 15:09:07
我也有类似的问题。我在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
不起作用。如果有人能阐明这一点,那将是有帮助的。
发布于 2020-10-07 20:51:22
尝试使用--editable
标志安装您的软件包,
pip install --editable <your-package>
# or
pip install --editable .
您遇到的问题可能是由于您使用pip install <your-package>
或pip install .
安装模块造成的。这将始终生成源代码的副本,并将其移动到pip安装目录。无论您导入此模块多少次,它都会引用与安装时相同的代码“快照”。
如果您使用pip install --editable <your-package>
或pip install --editable .
来安装软件包,则源代码的pip安装将引用执行安装的实际目录。当您在那里更改代码时,它应该正确地反映在您的笔记本中(假设您仍在使用神奇的命令;否则您将需要使用importlib
或重新启动内核来重新导入模块)。
%load_ext autoreload
%autoreload 2
发布于 2018-06-10 23:50:28
我认为,一旦您通过运行setup.py
(ref here)安装了一个包,您的python解释器将不再查看源代码,因为它会很容易地对其进行编译。在运行安装程序时,无论代码的版本是什么,您都可以使用它。
因此,这更多的是一个python问题,而不是Jupyter问题,您将需要重新运行安装程序,以便更新代码中可用的任何内容。这至少为我解决了这个问题
https://stackoverflow.com/questions/49541629
复制相似问题