从另一个 ipynb 文件导入一个 ipynb 文件?

交互式 Python (ipython)简直太神奇了,特别是当您在动态地把东西拼凑在一起时... ... 并且以一种很容易回到过去的方式来完成它。

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

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

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

217209 次浏览

问题是,笔记本不是一个普通的 python 文件。导入 .ipynb文件的步骤如下所示: 进口笔记本

我正在粘贴代码,所以如果你需要的话... 你可以快速复制粘贴。注意,在最后我有 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

在现有或新的 Python 中使用 Jupyter 没有任何问题。Py 模块。当 Jupiter 运行时,只需启动 Spyder (或您选择的任何编辑器)在。然后根据需要将模块导入到木星中。

有一件事情使得这个真正无缝的是使用自动重载魔法扩展。您可以在这里看到自动重载的文档:

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 文件。看起来需要重新启动 Jupyter 开发环境才能重新加载。Ipynb‘ module’,这对我来说是不可接受的,因为我对我的代码做了很多修改。

上面提到的评论非常有用,但是它们实现起来有点困难。下面的步骤你可以尝试一下,我也尝试了,它的工作:

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

在较新的木星上,这个过程非常简单:

%run MyOtherNotebook.ipynb

详情请参阅此处。

官方文件: IPython Magic 命令

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

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

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

我的 Stackoverflow 文章,一步一步的实验和解决方案:

Jupiter Notebook: 导入. ipynb 文件并访问其他. ipynb 文件中的方法,出现错误

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

从命令提示符安装我的 helper 库:

pip install import-ipynb

从你的笔记本导入:

import import_ipynb

现在导入.ipynb 笔记本,就像它是一个.py 文件一样

import TheOtherNotebook

这个 python-ipynb模块只是一个文件,它严格遵守在 Jupyter 站点上的 正式的方法

PS 它也支持像 from A import foofrom A import *等东西

PPS 使用子目录: import A.B

快跑

!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。完全大写的变量赋值也将得到求值。

你可以使用 import nbimporter然后 import notebookName

从命令提示符 安装 ipynb

pip install import-ipynb

导入笔记本文件

import import_ipynb

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

import MyOtherNotebook

% run YourNotebookfile.ipynb 运行良好;

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

然后你就可以用它了

%run YourNotebookfile.ipynb import Add

尽管“% run child Notebook.ipynb”命令是一个非常简单和有用的解决方案(如前面的答案所提到的) ,但是当子文件中还使用了另一个“% run grandNotebook.ipynb”,但是位于另一个目录中时,应该谨慎使用它!它可能导致文件的重复运行,并且也容易出错(因为子文件不再使用与其父文件相同的路径,当运行时,Jupiter 假定它这样做!)

为了解决上述问题,一个解决方案可能是: 在导入任何文件之前,首先检查工作目录的位置,然后根据这一点采取行动。这里有一个例子:

if 'myFolder' in os.getcwd():
%run graindChildNotebook.ipynb
else:
%run myFolder/grandChildNotebook.ipynb

在上面的示例中,首先检查我们是否在“ myFolder”目录中。如果是这样,我们就会发现“ grandChildNotebook”在同一个目录中,这样就足以正常运行它了。否则,我们需要通过添加该文件所在文件夹的名称来运行它。

小心,它只是一个例子,你应该做你的个性化解决方案的基础上,你的案例!