Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jupyter/IPython:编辑模块后,即使重新启动内核,更改也不会生效_Python_Jupyter Notebook - Fatal编程技术网

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

Jupyter/IPython:编辑模块后,即使重新启动内核,更改也不会生效,python,jupyter-notebook,Python,Jupyter Notebook,我正在Jupyter笔记本中编写一些代码,出于某种原因,它无法识别我何时对笔记本导入的模块进行了更改 我的Jupyter笔记本顶部有以下单元格: %load_ext autoreload %autoreload 2 基于此,我的理解是,在笔记本中执行任何代码时,该单元将强制模块重新加载。这意味着,如果我编辑了一个导入的模块,那么在下次运行代码时,编辑应该会反映出来。 即使没有这个单元,我也应该能够重新启动模块,从头开始运行每个单元,达到相同的效果。不幸的是,情况并非如此。无论我关闭/重新启动模

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

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

%load_ext autoreload
%autoreload 2
基于此,我的理解是,在笔记本中执行任何代码时,该单元将强制模块重新加载。这意味着,如果我编辑了一个导入的模块,那么在下次运行代码时,编辑应该会反映出来。 即使没有这个单元,我也应该能够重新启动模块,从头开始运行每个单元,达到相同的效果。不幸的是,情况并非如此。无论我关闭/重新启动模块多少次,甚至完全关闭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
---------------------------------------------------------------------------
ImportError回溯(最近一次呼叫最后一次)
在()
1导入一些_模块
2导入一些\u其他\u模块
---->3来自foo进口foo,Bar
4从另一个模块导入东西
5从最后一个模块导入最后一个
导入错误:无法导入名称栏

再次感谢你的帮助

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


这更多的是python问题,而不是Jupyter问题,您需要重新运行安装程序,以便更新代码中可用的内容。这至少解决了我的问题,我也有类似的问题。我在工作中找到了答案

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


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

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

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

您最终解决了这个问题吗?我现在正在努力解决这个问题。我相信我已经在我的回答中解释了魔法命令不起作用的原因。
pip install --editable <your-package>
# or
pip install --editable .
%load_ext autoreload
%autoreload 2