ipynb는 다른 ipynb 파일을 가져옵니다.


90

인터랙티브 파이썬 (ipython)은 정말 놀랍습니다. 특히 여러분이 즉석에서 함께 연결하고 ... 돌아 가기 쉬운 방식으로 수행 할 때 특히 그렇습니다.

그러나 흥미로운 것은 여러 개의 ipython 노트북 (ipynb 파일)을 사용하는 경우입니다. 다른 ipynb 파일을 가져 오는 것을 좋아한다는 점을 제외하고는 노트북이 다른 노트북과 관계가 없어야하는 것 같습니다.

내가 보는 유일한 해결 방법은 내 * .ipynb 파일을 * .py 파일로 변환 한 다음 내 노트북으로 가져올 수 있습니다. 하나의 파일이 프로젝트의 모든 것을 보유하는 것은 약간 이상합니다. 특히 코드 재사용을 정말로 추진하고 싶다면 (파이썬의 핵심 신조가 아닙니까?)

내가 뭔가를 놓치고 있습니까? ipython 노트북에서 지원되는 사용 사례가 아닙니까? ipynb 파일을 다른 노트북으로 가져 오는 데 사용할 수있는 다른 솔루션이 있습니까? ipynb를 계속 사용하고 싶지만 지금 당장 내 워크 플로를 엉망으로 만들고 있습니다.



2
노트북 서버를 시작하여 노트북의 --script.py 사본을 저장할 수 있습니다 . IPython 2.0에서는 %run노트북을 사용할 수 있습니다 . 우리는 여전히 코드 재사용을위한 더 나은 메커니즘을 연구하고 있습니다.
Thomas K

1
이 예제 는 중복 항목을 스크립트로 내 보내지 않고 IPython 노트북을 모듈로 가져 오는 방법을 보여줍니다.
minrk

답변:


130

최신 Jupyter에서는 정말 간단합니다.

%run MyOtherNotebook.ipynb

5
% run MyOtherNotebook.ipynb가 나를 위해 일했습니다. ( ''없음)
Florian H

6
이 방법은 자식 노트북을 완전히 실행합니다. 확인 __name__ == '__main__' and '__file__' not in globals()을 추가 하여 자녀 노트북에 있는지 확인할 수 있습니다. (에서 blog.sicara.com/... )
플라 Hautbois

8
% run 'MyOtherNotebook.ipynb'오류 : 루트 : 파일 u'MyOtherNotebook.ipynb.py'을 찾을 수 없습니다.
user3673

1
@ Kocur4d 수정 해 주셔서 감사합니다! 흥미롭게도 그것을 시도했을 때 (따옴표와 함께) 효과가 있었지만 문서의 예제에는 따옴표가 없습니다.
johndodo

3
사람이 건너 오면, 당신은 또한 % 실행 "/path/to/my/file/notebook.ipynb"와 같은 전체 경로를 사용할 수 있습니다
제레미

33

당신은 가져올 경우 A.ipynbB.ipynb쓰기

import import_ipynb
import A

에서 B.ipynb.

import_ipynb제작 한 모듈은 PIP를 통해 설치됩니다

pip install import_ipynb

그것은 단지 하나의 파일이며 jupyter 사이트 의 공식 하우투 를 엄격히 준수합니다 .

PS 또한 같은 것들을 지원 from A import foo, from A import *


@Crash pip install import-ipynb도 작동하고 동일한 패키지를 설치하지만 파이썬은 작성하는 것을 허용하지 않으며 import import-ipynb파일이 하나라고 생각하면 pip install import_ipynb더 일관성이 있습니다.
axil

3
사이에 어떤 차이가 있나요 import nbimporterimport import_ipynb?
Fractale

1
이것은 Python 3을 사용하는 Jupyter에서 전혀 작동하지 않습니다
Sebastialonso

@Sebastialonso 정확히 작동하지 않는 것은 무엇입니까? 수행하는 작업과 표시되는 오류 메시지를 설명하십시오. 이상적으로는 github에서 티켓을여십시오.
axil

@axil Py3에서 작동하지 않는 동일한 오류가 있습니다. 다음과 같은 오류가 발생합니다. ModuleNotFoundError : 'A'PS : A.ipynb라는 모듈이 같은 폴더에 없습니다
Soman Dubey

10

운영

!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. 전체 대문자 변수 할당도 평가됩니다.


파일 이름에 공백이 있으면 어떻게합니까?
Sameh

파일 이름에 공백을 두지 않는 것이 좋습니다
Malgo

2
설명 된 두 경우 모두 가져온 노트북이 전체적으로 실행됩니다. ipynb패키지는 오직 정의 부분의 실행을 지원한다. IPyhton의 공식 패키지이므로 이것이 허용되는 대답이어야한다고 생각합니다.
amka66

폴더 안에 노트북을 가져올 수 있습니까? 예MyFolder/book.ipynb
bones225

이것은 좋아 보였지만 예를 들어 % matplotlib inline을 만나면 넘어집니다 ....
jtlz2

7

명령 프롬프트에서 ipynb 설치

pip install import-ipynb

노트북 파일에서 가져 오기

import import_ipynb

이제 일반 가져 오기 명령을 사용하여 파일을 가져옵니다.

import MyOtherNotebook

가장 간단하지만 설명하는 대답. 감사!
The Poor Jew

3

import nbimporter그런 다음 사용할 수 있습니다.import notebookName


+1, nbimporter는 저에게 매력처럼 작동하며 conda를 사용하여 설치할 수도 있습니다.conda install -c conda-forge importnb
Zuku

2

위에서 언급 한 주석은 매우 유용하지만 구현하기가 약간 어렵습니다. 시도해 볼 수있는 단계 아래에서도 시도해 보았습니다.

  1. 노트북에서 PY 파일 형식으로 해당 파일을 다운로드합니다 (파일 탭에서 해당 옵션을 찾을 수 있음).
  2. 이제 다운로드 한 파일을 Jupyter Notebook의 작업 디렉토리에 복사합니다.
  3. 이제 사용할 준비가되었습니다. .PY 파일을 ipynb 파일로 가져 오기만하면됩니다.

hmm ... 나는 callee.ipync를 callee.py 파일로 변환 한 다음 caller.ipync와 같은 폴더 아래의 노트북에 callee.py 파일을 업로드했고 방금 작성한 caller.ipync에서 import callee, 그냥 할 수 없었습니다. 작업.
엘사 린

ps IPython은 버전 : 5.1.0입니다.
엘사 린

1

문제는 노트북이 일반 파이썬 파일이 아니라는 것입니다. .ipynb파일 을 가져 오는 단계 는 다음과 같습니다. 노트북 가져 오기

코드를 붙여넣고 있으므로 필요한 경우 간단히 복사하여 붙여 넣을 수 있습니다. 마지막에 나는 import primes진술 이 있음을 주목하라 . 물론 변경해야합니다. 내 파일의 이름은입니다 primes.ipynb. 이 시점부터 정기적으로 하듯이 해당 파일 내의 콘텐츠를 사용할 수 있습니다.

더 간단한 방법이 있었으면 좋겠지 만 이것은 문서에서 직접 가져온 것입니다.
참고 : ipython이 아닌 jupyter를 사용하고 있습니다.

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

1

기존 또는 새로운 Python .py 모듈과 함께 Jupyter를 사용하는 데 전혀 문제가 없습니다. Jupyter를 실행 한 상태에서 Spyder (또는 선택한 편집기)를 실행하여 .py 파일에서 모듈 클래스 정의를 빌드 / 수정 한 다음 필요에 따라 모듈을 Jupyter로 가져옵니다.

이것을 정말 원활하게 만드는 한 가지는 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 파일을 변경하면 질식합니다. .ipynb '모듈'을 다시로드하려면 Jupyter 개발 환경을 다시 시작해야하는 것 같습니다. 코드를 많이 변경했기 때문에 허용되지 않았습니다.


0

__init__.py다른 모든 .ipynb 파일이있는 패키지 에도 파일을 추가해야합니다 .

이것은 nbviewer 링크에 추가됩니다 minrksyi위에 제공.

나는 또한 비슷한 문제가 있었고 해결책과 작업 예제가있는 공개 Google 드라이브 폴더에 대한 링크를 작성했습니다. :)

단계별 실험 및 솔루션이 포함 된 내 Stackoverflow 게시물 :

Jupyter Notebook : .ipynb 파일을 가져 와서 다른 .ipynb 파일에서 해당 방법에 액세스하여 오류 발생

이것이 다른 사람들에게도 도움이되기를 바랍니다. 모두 감사합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.