包开发模式避免jupyter内核重启

Dav*_*eon 12 python pip python-3.x jupyter-notebook

我作为开发人员正在开发一个 python 包。该包存储在 git repo 中,我使用本地分支来调试/修复该包的功能。

为了测试我对代码所做的更正,我在编辑模式下使用 pip 使用 Jupyter 笔记本,以便将我的本地分支作为包加载,然后我测试我修改的功能。

我运行的步骤如下:

  1. 以开发模式加载本地包
  2. 导入模块我想测试
  3. 做测试

像这样例如:

! pip install -e Path/To/Local/Package/ # step 1

import local_foo as foo # step 2
foo.print() # step 3
Run Code Online (Sandbox Code Playgroud)

在第 3 步之后,如果代码没有按预期运行,我会更正我的包,重新启动 jupyter 内核并重新运行前面的 3 个步骤,直到获得我想要的行为。

我的问题是:
有没有办法避免重新启动内核?

我尝试了以下但在这种情况下不起作用:
IPython autoreload

%load_ext autoreload
%autoreload 2
Run Code Online (Sandbox Code Playgroud)

importlib.reload

import importlib
importlib.reload(foo)
Run Code Online (Sandbox Code Playgroud)

我尝试的解决方案来自这篇文章:https :
//support.enthought.com/hc/en-us/articles/204469240-Jupyter-IPython-After-editing-a-module-changes-are-not-effective-without-内核重启

非常感谢!


PS:另外,如果你们中的一些人可以分享使用 Jupyter notebooks 管理 python 包开发的技巧、工作流程或经验(测试,...)

Sha*_*ayn 0

您可能必须处理引用问题,因为非纯 Python 的包可能无法轻松地使用importlib.reload.

这可以通过在重新加载之前将其从模块和命名空间中删除来解决。

import foo  # The first import of the package

import sys
import importlib

# Do things with foo

del sys.modules['foo']  # Remove it from the currently loaded modules
del foo  # Remove it's name

importlib.reload(foo)
Run Code Online (Sandbox Code Playgroud)

约瑟夫·加文(Joseph Garvin)在这个答案中写了一个非常好的函数,它的操作类似并且也支持表单的导入from foo import bar