当本地模块中的代码发生更改时,我是不是总是必须在 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.ipynb

misc.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 总是崩溃

检测 Azure 移动应用客户端中的记录更改

当 BindingList 中的现有项目发生更改时,Listbox 拒绝更新

当 CMake 中的生成器或输入发生更改时,如何仅构建自动生成的代码?

当表单中的任何文本框发生更改时运行函数?微软访问

当 ipad 中的方向发生两次变化时,UIScrollView 的位置会发生变化