如何将一个Jupyter笔记本导入另一个

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将一个Jupyter笔记本导入另一个相关的知识,希望对你有一定的参考价值。

显然,有可能将一个Jupyter笔记本加入到另一个笔记本中。链接页面有相当多的代码来完成它。我应该将该代码添加到导入笔记本吗?页面不清楚。它应该是一个通用的解决方案,因此将所有代码添加到导入其他笔记本的所有笔记本中没有意义。任何帮助,将不胜感激。谢谢。

答案

是的,如果需要,您可以将所有代码添加到笔记本中。

是的,你不应该这样做作为一般解决方案。

笔记本是一个复杂的结构,在文本的细节中提到(我认为它是JSON)。它可以包含python代码,它可以包含魔法 - cython,bash,latex等等 - Python内核无法理解。基本上你必须复制普通Python导入过程的一部分功能,因为本机Python不会理解Ipython笔记本中有Python代码。

但是...通常如果您有大量的Python代码,您可以将其拆分为模块,然后导入模块。这些工作正常,因为它是一个普通的Python导入。

例如,一旦加载代码告诉它如何理解笔记本是什么,实际导入只是

import

我们可以在模块导入代码中使用相同的技术 - import nbpackage.mynotebookfind_notebook可以放入辅助模块(例如NotebookLoader),你需要做的就是从你的笔记本中使用helper.py

我怀疑你仍然需要从笔记本内部调用from helper import NotebookFinder以及导入。

以下是如何使用导入功能创建从笔记本中绘制的API的具体示例:

创建一个笔记本。我们称之为sys.meta_path.append(NotebookFinder())

scanner.ipynb

创建一个名为import os, sys def scanner(start): for root, dirs,files in os.walk(start): # remove any already processed file if 'done' in dirs: dirs.remove('done') for names in files: name, ext = os.path.splitext(names) # only interested in media files if ext == '.mp4' or ext == '.mkv': print(name) 的常规python文件。这是一般可重用的Ipython导入模块:

reuse.py

创建特定的API文件,将上面的加载器与上面的笔记本连接起来。叫它#! /usr/env/bin python # *-* coding: utf-8 *-* import io, os, sys, types from IPython import get_ipython from nbformat import read 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 = read(f, 4) # 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.cells: if cell.cell_type == 'code': # transform the input to executable Python code = self.shell.input_transformer_manager.transform_cell(cell.source) # 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]

scan_api.py

以上是关于如何将一个Jupyter笔记本导入另一个的主要内容,如果未能解决你的问题,请参考以下文章

如何导入已安装到另一个目录的 Python 库?

如何让 Jupyter Notebook 自动导入代码?

无法从已安装的 jupyter 内核导入 numpy

如何检查哪个 Jupyter 笔记本有“%run”另一个笔记本?

如何将一个数据块笔记本导入另一个?

如何检查您是不是在 Jupyter 笔记本中