交互式Python(ipython)简直令人惊叹,特别是当你在飞行中将事物拼凑在一起时...并且这样做很容易回归。
然而,似乎有趣的是拥有多个ipython笔记本(ipynb文件)的用例。它显然似乎是笔记本不应该与其他笔记本有关系,这是有道理的,除了我想要导入其他ipynb文件。
我看到的唯一解决方法是将我的* .ipynb文件转换为* .py文件,然后将其导入我的笔记本中。让一个文件保存在项目中的所有东西都有点奇怪,特别是如果我想真正推动代码重用(这不是python的核心原则吗?)。
我错过了什么吗?这不是ipython笔记本支持的用例吗?我可以使用另一种解决方案将ipynb文件导入另一个笔记本吗?我想继续使用ipynb,但它现在正在弄乱我的工作流程:(
答案 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 foo
,from 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)
上述评论非常有用,但实施起来有点困难。您可以尝试下面的步骤,我也尝试了它并且它有效:
答案 7 :(得分:0)
请确保您还在包中添加了minrk
个文件,其中包含所有其他.ipynb文件。
这是上面提供的syi
和desiredSubfield
的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