关于python:ipynb导入另一个ipynb文件

ipynb import another ipynb file

交互式Python(ipython)真是太神奇了,特别是当您快速地将事物拼凑在一起时……并且这样做的方式很容易返回。

但是,似乎有趣的是具有多个ipython笔记本(ipynb文件)的用例。似乎一个笔记本似乎不应该与其他笔记本有关系,这很有意义,只是我想导入其他ipynb文件。

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

我想念什么吗?这不是ipython笔记本的受支持用例吗?我可以使用另一种解决方案将ipynb文件导入到另一个笔记本中吗?我很乐意继续使用ipynb,但现在真的搞砸了我的工作流程:(


在较新的Jupyter中,这确实很简单:

1
%run MyOtherNotebook.ipynb


如果要从B.ipynb导入A.ipynb,请写

1
2
import import_ipynb
import A

B.ipynb中。

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

1
pip install import_ipynb

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

PS还支持from A import foofrom A import *


!pip install ipynb

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

from ipynb.fs.full. import *

要么

from ipynb.fs.full. import

确保所有笔记本位于同一目录中。


从命令提示符安装ipynb

1
pip install import-ipynb

导入您的笔记本文件

1
import import_ipynb

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

1
import MyOtherNotebook

您可以使用import nbimporter然后使用import notebookName


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

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

我也有一些类似的问题,然后我编写了解决方案以及指向我的公共Google Drive文件夹的链接,该文件夹有一个有效的示例:)

我的Stackoverflow帖子包含逐步实验和解决方案:

Jupyter Notebook:导入.ipynb文件并在其他给出错误的.ipynb文件中访问其方法

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


上面提到的注释非常有用,但是很难实现。在您可以尝试的以下步骤中,我也尝试了并且它有效:

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

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

    使这一过程真正无缝的一件事是使用autoreload magic扩展。您可以在此处查看自动重新加载的文档:

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

    以下是在修改模块后自动重新加载模块的代码:

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

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


    问题是笔记本不是普通的python文件。以下概述了导入.ipynb文件的步骤:导入笔记本

    我正在粘贴代码,因此,如果您需要它...您可以进行快速复制和粘贴。请注意,最后我有import primes语句。当然,您必须更改它。我的文件名是primes.ipynb。从这一点开始,您可以像平常一样使用该文件中的内容。

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    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