如何在Jupyter Notebook中使用来自外部Python文件的代码?

DP_*_*DP_ 4 python jupyter jupyter-notebook

我有一个宠物项目,最初是从Jupyter笔记本开始的。到目前为止,我将所有Python代码都放在了笔记本中。

开始时一切都很好。但是随着时间的流逝,我在笔记本中编写的代码变得越来越复杂。现在几乎无法处理:当我发现错误时,我需要

  1. 导航到带有错误的代码部分(通常在笔记本的开头),
  2. 在那里修复错误,
  3. 转到(通常)笔记本的底部以触发我更改的代码的执行。

我想将代码分为两部分:

  1. 其中一个将存储为Python文件,我将使用编辑器(和/或IDE)进行编辑。
  2. Jupyter笔记本中的代码将调用代码部分1并显示其输出(即,将Jupyter笔记本用作步骤1中Python代码的用户界面)。

假设笔记本在我的本地计算机上运行(Windows 7; Jupyter在Anaconda中运行),并且Python文件也存储在本地。

有什么好的方法可以使用IPython文件中的代码,以便我可以频繁,快速地修改此代码?

“频繁且快速”是指“将更改从Python文件传播到笔记本的步骤尽可能少”。理想的解决方案是我更改其中一个Python文件,运行一个命令,然后在Jupyter笔记本中进行更改。或者,使用旧的类比,我希望它像PHP一样-您经常更改代码并立即查看更改的结果。

更新1:我试图%load TestClass.py在单元格中使用该解决方案。

问题是,如果文件更改,则单元格内容不会更新。

例:

假设我把文字

class TestClass:
    def __init__(self):
        print("TestClass constructor")
Run Code Online (Sandbox Code Playgroud)

进入TestClass.py。然后,我在Jupyter笔记本中使用创建一个单元格%load TestClass.py。当我执行该单元格时,将TestClass.py导入from中的代码,并将该行%load TestClass.py注释掉。

现在我换TestClass.py

class TestClass:
    def __init__(self):
        print("TestClass constructor")
        print("change")
Run Code Online (Sandbox Code Playgroud)

当我执行该单元格时,其内容未更改。

Tob*_*sch 6

听起来IPython 的autoload扩展正是您所需要的。只需插入

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

在Jupyter笔记本的第一个单元格中,导入的python模块会在更改时自动重新加载。您还可以对已安装的python软件包进行更改,前提是您已将其安装为editable