当本地模块中的代码更改时,我是否总是需要在 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
当我使用 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