【问题标题】: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(),我该如何重新加载模块?

【问题讨论】:

    标签: python jupyter-notebook python-module


    【解决方案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.

      【讨论】:

      • 我非常喜欢这个内置功能。谢谢!
      猜你喜欢
      • 2014-12-07
      • 2016-05-16
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多