当本地模块中的代码更改时,我是否总是需要在 Jupyter Lab 中重新启动内核?

Do I always have to restart my kernel in Jupyter Lab when code in a local module changes?

当我使用 Jupyter Lab 处理笔记本时,我经常将代码放入本地文件夹,以便我可以在其他笔记本中重用该代码。我通常通过执行以下操作来引用该本地模块。

import os
import sys

sys.path.insert(0, os.path.abspath('.'))

因此,如果我发现错误或需要增强代码并修改 *.py 文件,我无法通过简单地重新 运行 单元来加载新代码。我必须重新启动新内核才能获得新的更改。这个开发周期非常糟糕,尤其是当笔记本的某些部分在计算上昂贵到 运行。

关于如何使用 Juypter Lab notebook 更高效地编码和修改模块代码,是否有任何提示?

我的代码结构如下所示。

temp/
├── lib
│   ├── __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(),我该如何重新加载模块?

如果我理解正确的话,您正在导入您的模块,并且您想在修改后重新加载它们。这可以使用 importlib.reload() 函数来完成:

import importlib
importlib.reload(my_module) 

模块 my_module 之前必须已导入才能重新加载。

在@bb1 的指导下,我能够让它工作。看来我必须使用以下代码在所有单元格(某处)上方或下方有一个悬挂单元格。

import importlib
import sys

_ = importlib.reload(sys.modules['lib'])
_ = importlib.reload(sys.modules['lib.utils'])

如果我更改模块中的代码,我将不得不重新运行这个单元格,新代码才会生效。

如果需要,您可以使用 sys.modules.keys() 检查加载的模块。

最好的方法是使用 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.