首页 > 解决方案 > 如何在 Jupyter 笔记本中使用来自外部 Python 文件的代码?

问题描述

我有一个作为 Jupyter 笔记本开始的宠物项目。到目前为止,我把所有的 Python 代码都放在了 notebook 中。

一开始一切都很好。但随着时间的推移,我在笔记本上写的代码变得越来越复杂。现在它几乎无法管理:当我发现错误时,我需要

  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")

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

现在我TestClass.py改为

class TestClass:
    def __init__(self):
        print("TestClass constructor")
        print("change")

当我执行单元格时,它的内容没有改变。

标签: pythonjupyter-notebookjupyter

解决方案


听起来 IPython 的自动加载扩展正是您所需要的。只需插入

%load_ext autoreload
%autoreload 2

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


推荐阅读