2013-11-25 243 views
23

交互式Python(ipython)简直太神奇了,特别是当你在飞行中拼凑一些东西时......并且这样做很容易返回。ipynb导入另一个ipynb文件

然而,似乎有趣的是有多个ipython笔记本(ipynb文件)的用例。它显然看起来像一个笔记本电脑不应该与其他笔记本电脑有关系,这是有道理的,除了我很想导入其他ipynb文件。

我看到的唯一解决方法是将我的* .ipynb文件转换为* .py文件,然后将其导入到我的笔记本中。让一个文件包含项目中的所有内容有点奇怪,特别是如果我真的想要推动代码重用(不是Python的核心原则?)。

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

+0

可能重复:http://stackoverflow.com/questions/19082397/including-a-notebook-in-another-notebook-in-ipython –

+1

你可以用' - script'启动笔记本服务器来保存笔记本的.py副本。在IPython 2.0中,你将能够'运行'一个笔记本。我们仍在制定更好的代码重用机制。 –

+0

https://stackoverflow.com/q/20186344/478206,https://stackoverflow.com/q/19082397/478206和https://stackoverflow.com/q/19564625/478206都提出相同的问题。 –

回答

14

This example说明如何导入IPython的笔记本电脑的模块,而出口的复印件,脚本。

+0

太棒了。非常感谢...我已经搜索了约4个小时的答案,并且找不到任何东西! –

+0

问题提出后有没有更好的方法来做到这一点?我觉得进口其他笔记本可能更适合Jupyter使用。 – user1496984

+0

您提供的链接是“404:未找到”。有没有人有类似(或刷新)的链接?谢谢 ! – probaPerception

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 
0

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

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

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'模块',这是我无法接受的,因为我正在对代码进行大量更改。

1

上述评论非常有用,但它们有点难以实现。下面的步骤,你可以试试,我也尝试过了,它的工作:

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

嗯...我将callee.ipync转换为callee.py文件,然后将callee.py文件上传到笔记本下与caller.ipync相同的文件夹中,并在调用方中。ipync我刚写了'import callee',就是不行。 –

+0

ps.s. IPython的版本是:5.1.0。 –

+0

抱歉虚惊一场。这种方式很好。 –

36

它是在新的Jupyter很简单:

%run 'MyOtherNotebook.ipynb' 
+2

运行MyOtherNotebook.ipynb为我完成了这项工作。 (不'') –

+0

小心,这种方法将完全运行子笔记本。你可以在globals()中添加一个检查'__name__ =='__main__'和'__file__'来验证你是否在子笔记本中。 (来自https://blog.sicara.com/present-data-science-results-jupyter-notebook-import-into-another-108433bc8505) –

+0

这对我不起作用。我得到如下: 'NameError回溯(最近通话最后一个) C:\开发\学习\ python的\ interpret_basics \)nursery_utils.IPYNB在( 3 { 4 “单元类型”: “代码”, - ---> 5“execution_count”:null, 6“metadata”:{ 7“collapsed”:true NameError:name'null'is not defined' – julianhatwell

0

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

这是除了上面提供的minrksyi提供的nbviewer链接之外。

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

我后#1一步一步的实验和解决方案:

Jupyter Notebook: Import .ipynb file and access it's method in other .ipynb file giving error

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

0

如果要导入A.ipynbB.ipynb

import import_ipynb 
import A 
B.ipynb

我创建了import_ipynb模块通过PIP安装:

pip install import_ipynb 

这只是一个文件,并严格遵守official howto上jupyter网站。

PS它还支持之类的东西from A import foofrom A import *

相关问题