【问题标题】:Importing an ipynb file from another ipynb file?从另一个 ipynb 文件导入 ipynb 文件?
【发布时间】:2013-12-09 18:46:02
【问题描述】:

交互式 Python (ipython) 简直太棒了,尤其是当您在运行中将事物拼凑在一起时……并且以一种很容易返回的方式进行。

然而,有趣的是拥有多个 ipython 笔记本(ipynb 文件)的用例。显然,笔记本似乎不应该与其他笔记本有关系,这是有道理的,除了我想导入其他 ipynb 文件。

我看到的唯一解决方法是将我的 *.ipynb 文件转换为 *.py 文件,然后可以将其导入我的笔记本中。让一个文件保存项目中的所有内容有点奇怪,特别是如果我想真正推动代码重用(这不是 python 的核心原则吗?)。

我错过了什么吗?这不是 ipython 笔记本支持的用例吗?我可以使用另一种解决方案将 ipynb 文件导入另一个笔记本吗?我很想继续使用 ipynb,但它现在真的打乱了我的工作流程:(

【问题讨论】:

标签: python import workflow ipython


【解决方案1】:

在较新的 Jupyter 中真的很简单:

%run MyOtherNotebook.ipynb

【讨论】:

  • %run MyOtherNotebook.ipynb 为我完成了这项工作。 (没有'')
  • 小心,这个方法会完全运行子笔记本。您可以添加检查 __name__ == '__main__' and '__file__' not in globals() 以验证您是否在子笔记本中。 (来自blog.sicara.com/…
  • %run 'MyOtherNotebook.ipynb' 错误:root:File u'MyOtherNotebook.ipynb.py' not found.
  • @Kocur4d 感谢您的修复!有趣的是,当我尝试它时它对我有用(带引号),但文档中的示例没有任何引号。
  • 如果有人遇到这种情况,您也可以使用完整路径,例如 %run "/path/to/my/file/notebook.ipynb"
【解决方案2】:

从命令提示符安装我的帮助程序库:

pip install import-ipynb

从您的笔记本中导入:

import import_ipynb

现在像导入 .py 文件一样导入您的 .ipynb 笔记本

import TheOtherNotebook

这个python-ipynb 模块只是一个文件,它严格遵守jupyter 网站上的official howto

PS 它还支持from A import foofrom A import * 等内容

PPS 适用于子目录:import A.B

【讨论】:

  • @Crash pip install import-ipynb 也可以工作并安装相同的包,但由于 python 不允许您编写 import import-ipynb 并且考虑到它只是一个文件,pip install import_ipynb 对我来说看起来更一致.
  • import nbimporterimport import_ipynb有什么区别吗?
  • 这在我的带有 Python 3 的 Jupyter 中根本不起作用
  • @Sebastialonso 究竟什么不起作用?描述你做了什么以及你看到了什么错误信息。最好在github上开一张票。
  • @axil。对不起,我当时在执行过程中犯了一个错误,后来我才知道。现在它工作正常。 tysm
【解决方案3】:

运行

!pip install ipynb

然后将另一个笔记本导入为

from ipynb.fs.full.<notebook_name> import *

from ipynb.fs.full.<notebook_name> import <function_name>

确保所有笔记本都在同一个目录中。

编辑1:您可以在此处查看官方文档-https://ipynb.readthedocs.io/en/stable/

另外,如果您只想从笔记本中导入类和函数定义(而不是顶级语句),您可以使用ipynb.fs.defs 而不是ipynb.fs.full。完整的大写变量赋值也会被评估。

【讨论】:

  • 如果我的文件名中有空格怎么办?
  • 建议不要在文件名中保留任何空格
  • 请注意,在所描述的两种情况下,导入的笔记本都是完整执行的。 ipynb 包还支持仅部分执行定义。它是 IPyhton 的官方包,所以我相信这应该是公认的答案。
  • 这可以在文件夹中导入笔记本吗?例如MyFolder/book.ipynb
  • 这看起来不错,但遇到例如%matplotlib 内联....
【解决方案4】:

从命令提示符安装 ipynb

pip install import-ipynb

在您的笔记本文件中导入

import import_ipynb

现在使用常规导入命令来导入您的文件

import MyOtherNotebook

【讨论】:

  • 最简单但解释性的答案。谢谢!
  • 这是否要求要导入的笔记本所在的目录有一个 init.py ?
  • 感谢您提供有关如何正确编写文档的线索)
【解决方案5】:

你可以使用import nbimporter 然后import notebookName

【讨论】:

  • +1,nbimporter 对我来说就像一个魅力,也可以使用 conda 安装:conda install -c conda-forge importnb
【解决方案6】:

上面提到的 cmets 非常有用,但是实现起来有点困难。您可以尝试以下步骤,我也尝试过并且有效:

  1. 以 PY 文件格式从您的笔记本下载该文件(您可以在“文件”选项卡中找到该选项)。
  2. 现在将下载的文件复制到 Jupyter Notebook 的工作目录中
  3. 您现在可以使用它了。只需将 .PY 文件导入到 ipynb 文件中

【讨论】:

  • hmm...我把callee.ipync转换成callee.py文件,然后把callee.py文件上传到和caller.ipync同文件夹下的notebook上,在caller.ipync里面我刚刚写了import callee,实在不行。
  • 附注IPython 是版本:5.1.0。
【解决方案7】:

%run YourNotebookfile.ipynb 工作正常;

如果你想导入一个特定的模块,那么只需在 ipynb 之后添加导入命令 即 YourNotebookfile.ipynb 具有 def Add()

那么你就可以使用它了

%run YourNotebookfile.ipynb import Add

【讨论】:

    【解决方案8】:

    问题在于笔记本不是普通的 python 文件。导入.ipynb 文件的步骤概述如下:Importing notebook

    我正在粘贴代码,所以如果您需要...您可以快速复制和粘贴。请注意,最后我有 import primes 声明。当然,你必须改变它。我的文件名是primes.ipynb。从此时起,您可以像往常一样使用该文件中的内容。

    希望有一个更简单的方法,但这直接来自文档。
    注意:我使用的是 jupyter 而不是 ipython。

    import io, os, sys, types
    from IPython import get_ipython
    from nbformat import current
    from IPython.core.interactiveshell import InteractiveShell
    
    
    def find_notebook(fullname, path=None):
        """find a notebook, given its fully qualified name and an optional path
    
        This turns "foo.bar" into "foo/bar.ipynb"
        and tries turning "Foo_Bar" into "Foo Bar" if Foo_Bar
        does not exist.
        """
        name = fullname.rsplit('.', 1)[-1]
        if not path:
            path = ['']
        for d in path:
            nb_path = os.path.join(d, name + ".ipynb")
            if os.path.isfile(nb_path):
                return nb_path
            # let import Notebook_Name find "Notebook Name.ipynb"
            nb_path = nb_path.replace("_", " ")
            if os.path.isfile(nb_path):
                return nb_path
    
    
    class NotebookLoader(object):
        """Module Loader for Jupyter Notebooks"""
        def __init__(self, path=None):
            self.shell = InteractiveShell.instance()
            self.path = path
    
        def load_module(self, fullname):
            """import a notebook as a module"""
            path = find_notebook(fullname, self.path)
    
            print ("importing Jupyter notebook from %s" % path)
    
            # load the notebook object
            with io.open(path, 'r', encoding='utf-8') as f:
                nb = current.read(f, 'json')
    
    
            # create the module and add it to sys.modules
            # if name in sys.modules:
            #    return sys.modules[name]
            mod = types.ModuleType(fullname)
            mod.__file__ = path
            mod.__loader__ = self
            mod.__dict__['get_ipython'] = get_ipython
            sys.modules[fullname] = mod
    
            # extra work to ensure that magics that would affect the user_ns
            # actually affect the notebook module's ns
            save_user_ns = self.shell.user_ns
            self.shell.user_ns = mod.__dict__
    
            try:
            for cell in nb.worksheets[0].cells:
                if cell.cell_type == 'code' and cell.language == 'python':
                    # transform the input to executable Python
                    code = self.shell.input_transformer_manager.transform_cell(cell.input)
                    # run the code in themodule
                    exec(code, mod.__dict__)
            finally:
                self.shell.user_ns = save_user_ns
            return mod
    
    
    class NotebookFinder(object):
        """Module finder that locates Jupyter Notebooks"""
        def __init__(self):
            self.loaders = {}
    
        def find_module(self, fullname, path=None):
            nb_path = find_notebook(fullname, path)
            if not nb_path:
                return
    
            key = path
            if path:
                # lists aren't hashable
                key = os.path.sep.join(path)
    
            if key not in self.loaders:
                self.loaders[key] = NotebookLoader(path)
            return self.loaders[key]
    
    sys.meta_path.append(NotebookFinder())
    
    import primes
    

    【讨论】:

      【解决方案9】:

      将 Jupyter 与现有或新的 Python .py 模块一起使用完全没有问题。在 Jupyter 运行的情况下,只需启动 Spyder(或您选择的任何编辑器)即可在 .py 文件中构建/修改模块类定义,然后根据需要将模块导入 Jupyter。

      使用自动重载魔法扩展是真正无缝的一件事。您可以在此处查看 autoreload 的文档:

      http://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html

      这是在模块被修改时自动重新加载模块的代码:

      # autoreload sets up auto reloading of modified .py modules
      import autoreload
      %load_ext autoreload
      %autoreload 2
      

      请注意,我尝试使用之前回复中提到的代码来模拟将 .ipynb 文件作为模块加载,并让它工作,但是当您更改 .ipynb 文件时它会阻塞。看起来您需要重新启动 Jupyter 开发环境才能重新加载 .ipynb '模块',这对我来说是不可接受的,因为我对我的代码进行了大量更改。

      【讨论】:

        【解决方案10】:

        请确保您还在所有其他 .ipynb 文件所在的包中添加一个 __init__.py 文件。

        这是对上面提供的 minrksyi 的 nbviewer 链接的补充。

        我也遇到了一些类似的问题,然后我编写了解决方案以及指向我的公共 google 驱动器文件夹的链接,该文件夹有一个工作示例:)

        我的 Stackoverflow 帖子,附有分步实验和解决方案:

        Jupyter Notebook: Import .ipynb file and access it's method in other .ipynb file giving error

        希望这对其他人也有帮助。 谢谢大家!

        【讨论】:

          猜你喜欢
          • 2017-10-22
          • 1970-01-01
          • 1970-01-01
          • 2022-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-28
          • 1970-01-01
          相关资源
          最近更新 更多