首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jupyter / IPython:编辑模块后,即使重新启动内核,更改也不会生效

Jupyter / IPython:编辑模块后,即使重新启动内核,更改也不会生效
EN

Stack Overflow用户
提问于 2018-03-29 02:25:36
回答 3查看 3.3K关注 0票数 3

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

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

代码语言:javascript
运行
复制
%load_ext autoreload
%autoreload 2

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

我在一个虚拟环境中工作,到目前为止,我找到的唯一解决方案是运行一个完全重建环境的脚本(包括重新下载软件包等)。这是一种痛苦,也是对时间的极大浪费。

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

任何见解都将不胜感激。

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

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

代码语言:javascript
运行
复制
class Foo(object):
    foo_bool = True

在我的笔记本里,我有这样一个细胞:

代码语言:javascript
运行
复制
from foo import Foo

然后我添加到foo.py

代码语言:javascript
运行
复制
class Foo(object):
    foo_bool = True


class Bar(object):
    bar_bool = False

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

代码语言:javascript
运行
复制
from foo import Foo, Bar

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

代码语言:javascript
运行
复制
---------------------------------------------------------------------------
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

再次感谢你的帮助!

EN

回答 3

Stack Overflow用户

发布于 2019-11-08 15:09:07

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

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

代码语言:javascript
运行
复制
import importlib
import foo
from foo import Foo, Bar

foo = importlib.reload(foo)

我不知道为什么神奇的命令%load_ext autoreload%autoreload 2不起作用。如果有人能阐明这一点,那将是有帮助的。

票数 2
EN

Stack Overflow用户

发布于 2020-10-07 20:51:22

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

代码语言:javascript
运行
复制
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或重新启动内核来重新导入模块)。

代码语言:javascript
运行
复制
%load_ext autoreload
%autoreload 2
票数 1
EN

Stack Overflow用户

发布于 2018-06-10 23:50:28

我认为,一旦您通过运行setup.py (ref here)安装了一个包,您的python解释器将不再查看源代码,因为它会很容易地对其进行编译。在运行安装程序时,无论代码的版本是什么,您都可以使用它。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49541629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档