当本地模块中的代码发生更改时,我是不是总是必须在 Jupyter Lab 中重新启动内核?
Posted
技术标签:
【中文标题】当本地模块中的代码发生更改时,我是不是总是必须在 Jupyter Lab 中重新启动内核?【英文标题】:Do I always have to restart my kernel in Jupyter Lab when code in a local module changes?当本地模块中的代码发生更改时,我是否总是必须在 Jupyter Lab 中重新启动内核? 【发布时间】:2021-06-23 22:29:26 【问题描述】:当我使用 Jupyter Lab 编写笔记本时,我经常将代码放入本地文件夹,以便可以在其他笔记本中重复使用该代码。我通常通过执行以下操作来引用该本地模块。
import os
import sys
sys.path.insert(0, os.path.abspath('.'))
因此,如果我发现错误或需要增强代码并修改 *.py
文件,我无法通过简单地重新运行单元来加载新代码。我必须重新启动新内核才能获得新的更改。这个开发周期非常糟糕,尤其是当 notebook 的某些部分运行起来计算成本很高时。
是否有关于如何在 Juypter Lab 笔记本旁边更有效地编写和修改模块代码的任何提示?
我的代码结构如下所示。
温度/ ├── 库 │ ├── __init__.py │ ├── misc.py │ └── utils.py └── notebook.ipynbmisc.py
的代码如下。
def say_hi(name):
print(f'hi name')
utils.py
的代码如下。
def say_bye(name):
print(f'bye bye name')
在一个单元格中,然后我按如下方式导入一个函数。
from lib.utils import say_bye
say_bye('john')
现在假设我更改了say_bye()
,我该如何重新加载模块?
【问题讨论】:
【参考方案1】:如果我理解正确,您正在导入您的模块,并且您希望在进行修改后重新加载它们。这可以使用importlib.reload() 函数来完成:
import importlib
importlib.reload(my_module)
模块my_module
必须先前已导入才能重新加载。
【讨论】:
我添加了有关我正在使用的设置的更多信息。命令究竟是什么?当我尝试importlib.reload(lib)
时,它会显示NameError: name 'lib' is not defined
。【参考方案2】:
在@bb1 的指导下,我能够让它工作。看来我必须使用以下代码在所有单元格(某处)上方或下方有一个悬空单元格。
import importlib
import sys
_ = importlib.reload(sys.modules['lib'])
_ = importlib.reload(sys.modules['lib.utils'])
如果我更改模块中的代码,我将不得不重新运行此单元格,新代码才会生效。
如果需要,您可以使用 sys.modules.keys()
检查加载的模块。
【讨论】:
【参考方案3】:最好的方法是使用来自 IPython 的 autoreload
魔法:
In [1]: %load_ext autoreload
In [2]: %autoreload 2
In [3]: from foo import some_function
In [4]: some_function()
Out[4]: 42
In [5]: # open foo.py in an editor and change some_function to return 43
In [6]: some_function()
Out[6]: 43
Documentation.
【讨论】:
我非常喜欢这个内置功能。谢谢!以上是关于当本地模块中的代码发生更改时,我是不是总是必须在 Jupyter Lab 中重新启动内核?的主要内容,如果未能解决你的问题,请参考以下文章
UITextView 更改 selectRange 总是崩溃
当 BindingList 中的现有项目发生更改时,Listbox 拒绝更新