ipynb import another ipynb file
交互式Python(ipython)真是太神奇了,特别是当您快速地将事物拼凑在一起时……并且这样做的方式很容易返回。
但是,似乎有趣的是具有多个ipython笔记本(ipynb文件)的用例。似乎一个笔记本似乎不应该与其他笔记本有关系,这很有意义,只是我想导入其他ipynb文件。
我看到的唯一解决方法是将* .ipynb文件转换为* .py文件,然后可以将其导入到笔记本中。只有一个文件可以容纳项目中的所有内容,这有点怪异,特别是如果我想真正推动代码重用(这不是python的核心宗旨吗?)。
我想念什么吗?这不是ipython笔记本的受支持用例吗?我可以使用另一种解决方案将ipynb文件导入到另一个笔记本中吗?我很乐意继续使用ipynb,但现在真的搞砸了我的工作流程:(
在较新的Jupyter中,这确实很简单:
1 | %run MyOtherNotebook.ipynb |
如果要从
1 2 | import import_ipynb import A |
在
我创建的
1 | pip install import_ipynb |
它只是一个文件,严格遵守jupyter网站上的官方howto。
PS还支持
跑
然后将另一个笔记本导入为
要么
确保所有笔记本位于同一目录中。
从命令提示符安装ipynb
1 | pip install import-ipynb |
导入您的笔记本文件
1 | import import_ipynb |
现在使用常规的导入命令来导入文件
1 | import MyOtherNotebook |
您可以使用
请确保还在所有其他.ipynb文件所在的包中添加一个
这是上面
我也有一些类似的问题,然后我编写了解决方案以及指向我的公共Google Drive文件夹的链接,该文件夹有一个有效的示例:)
我的Stackoverflow帖子包含逐步实验和解决方案:
Jupyter Notebook:导入.ipynb文件并在其他给出错误的.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文件。以下概述了导入
我正在粘贴代码,因此,如果您需要它...您可以进行快速复制和粘贴。请注意,最后我有
希望有一个更简单的方法,但这直接来自文档。
注意:我使用的是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 |