如何在 Jupyter Notebook 单元格中刷新 Python 导入?

13

我有两个文件:

MyModule.py MyNotebook.ipynb

我正在使用最新版本的Jupyter笔记本和Python。我的笔记本中有两个代码单元格。

单元格#1

import some stuff
Run some code
(Keep everything in the environment takes about five minutes to run this cell).

单元格 #2

import MyModule
Execute code from MyModule

我想在MyModule.py中进行代码更改并重新运行Cell #2,但不想重新启动内核(Cell #1已经做了很多工作,我不想每次都重新运行)。 如果我只是运行第二个单元格,对MyModule.py所做的更改不会传播。我进行了一些调查,并尝试使用importlib.reload。 Cell #2的实际代码如下:
from Nash.IOEngineNash import *
import importlib
importlib.reload(Nash.IOEngineNash)

很不幸,目前这种方法并不能正常工作。我该如何将MyModule.py中的更改(实际情况下可能是Nash/IOEngineNash.py)推送到笔记本中,而无需重启内核并从头开始运行?


尝试重新加载整个 Nash 模块。import Nash as nash; from importlib reload reload; reload(nash)。此外,您可以使用所需的 IOEngineNash - Vaebhav
感谢您的评论。"from Nash.IOEngineNash import *" 不是重新加载整个模块吗?我可能错了。此外,使用 "import Nash" 而不是添加 "as nash" 不就可以了吗?再次感谢。 - Anthony Nash
1
我曾经遇到过同样的问题,在导入自定义脚本时,当使用import的别名时,reload起作用了。 - Vaebhav
太棒了,它起作用了。如果你把它作为答案添加,我可以点赞等等。再次感谢。 - Anthony Nash
2个回答

16

我曾经碰到过类似的问题,在jupyter notebook中导入自定义脚本时。

尝试将模块作为“别名”导入,然后重新加载它。


import Nash as nash
from importlib import reload
reload(nash)


1
为了确保所有对旧版本模块的引用都得到更新,您可能需要在重新加载后重新导入它,例如:
import mymodule
reload(mymodule)
import mymodule

由于importlib.reload仅重新加载您要求重新加载的(顶级)模块,而不是其子模块或外部模块,因此可能会出现隐式依赖关系引起的问题。

如果您想递归地重新加载一个模块,您可以查看this gist,它允许您在笔记本单元格的顶部简单地添加一行代码:

%reload mymodule
import mymodule

这会递归地重新加载mymodule以及它的所有子模块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接