ipynb导入另一个ipynb文件

时间:2013-11-25 06:52:38

标签: python import workflow ipython

交互式Python(ipython)简直令人惊叹,特别是当你在飞行中将事物拼凑在一起时...并且这样做很容易回归。

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

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

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

10 个答案:

答案 0 :(得分:70)

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

%run MyOtherNotebook.ipynb

答案 1 :(得分:13)

如果您想从A.ipynb写入

来导入B.ipynb
import import_ipynb
import A
B.ipynb中的

我创建的import_ipynb模块是通过pip安装的:

pip install import_ipynb

它只是一个文件,它严格遵守jupyter网站上的official howto

PS它还支持from A import foofrom A import *

之类的内容

答案 2 :(得分:2)

%run YourNotebookfile.ipynb 工作正常;

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

然后你就可以使用它了

%run YourNotebookfile.ipynb import Add

答案 3 :(得分:1)

运行

!pip install ipynb

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

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

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

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

答案 4 :(得分:0)

问题是笔记本不是普通的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

答案 5 :(得分:0)

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

使真正无缝的一件事就是使用autoreload magic扩展。您可以在此处查看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&#39;模块,这是我无法接受的,因为我对代码进行了大量更改。

答案 6 :(得分:0)

上述评论非常有用,但实施起来有点困难。您可以尝试下面的步骤,我也尝试了它并且它有效:

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

答案 7 :(得分:0)

请确保您还在包中添加了minrk个文件,其中包含所有其他.ipynb文件。

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

我也有一些类似的问题,然后我写了解决方案以及一个链接到我的公共谷歌驱动器文件夹,其中有一个工作示例:)

我的Stackoverflow帖子一步一步的实验和解决方案:

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

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

答案 8 :(得分:0)

您可以先使用import nbimporter,然后再使用import notebookName

答案 9 :(得分:0)

从命令提示符安装ipynb

pip install import-ipynb

导入您的笔记本文件

import import_ipynb

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

import MyOtherNotebook