programing

다른 ipynb 파일에서 ipynb 파일을 가져오시겠습니까?

oldcodes 2023. 6. 8. 22:33
반응형

다른 ipynb 파일에서 ipynb 파일을 가져오시겠습니까?

인터랙티브 파이썬(ipython)은 정말 놀랍습니다. 특히 당신이 즉석에서 물건을 조립하고 있기 때문에...그리고 쉽게 돌아갈 수 있는 방식으로 그것을 합니다.

하지만 흥미로운 것은 여러 개의 ipython 노트북(ipynb 파일)을 가지고 있는 사용 사례입니다.다른 ipynb 파일을 가져오고 싶다는 점을 제외하고는 노트북이 다른 노트북과 관계를 맺으면 안 되는 것으로 보입니다.

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

내가 뭘 빼놓았나요?ipython 노트북 사용 사례가 지원되지 않습니까?ipynb 파일을 다른 노트북으로 가져오는 데 사용할 수 있는 다른 솔루션이 있습니까?ipynb를 계속 사용하고 싶지만, 지금 제 작업 흐름을 정말 엉망으로 만들고 있습니다 :(

그것은 새로운 목성에서 정말 간단합니다.

%run MyOtherNotebook.ipynb

자세한 내용은 여기를 참조하십시오.

공식 문서: IPython 매직 명령

명령 프롬프트에서 도우미 라이브러리 설치:

pip install import-ipynb

노트북에서 가져오기:

import import_ipynb

이제 .ipynb 노트북을 .py 파일처럼 가져옵니다.

import TheOtherNotebook

것이.python-ipynb모듈은 하나의 파일일 뿐이며 주피터 사이트에서 공식적인 방법을 엄격하게 준수합니다.

▁ps▁like▁things다▁ps▁supports니▁it도 지원합니다.from A import foo,from A import *

는 하위와 함께 작동합니다: PPS는 다음과 같습니다.import A.B

달려.

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

명령 프롬프트에서 ipynb 설치

pip install import-ipynb

노트북 파일로 가져오기

import import_ipynb

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

import MyOtherNotebook

%runNotebookfile.ipynb가 정상적으로 작동합니다.

특정 모듈을 가져오려면 ipynbi.eNotebookfile.ipynb 뒤에 defAdd()가 있는 import 명령을 추가하면 됩니다.

그럼 그냥 사용하시면 됩니다.

%run YourNotebookfile.ipynb import Add

위에 언급된 의견은 매우 유용하지만 구현하기가 조금 어렵습니다.시도할 수 있는 단계 아래에서 저도 시도해 보았는데 효과가 있었습니다.

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

사용할 수 있습니다.import nbimporter그리고나서import notebookName

문제는 노트북이 일반 파이썬 파일이 아니라는 점입니다..ipynb파일의 개요는 다음과 같습니다.노트북을 가져오는 중

코드를 붙여넣고 있으니 필요하시면...복사해서 붙여넣기만 하면 됩니다.마지막에 내가 가지고 있는 것을 주목하세요.import primes진술. 물론 당신은 그것을 바꿔야 할 것입니다.은 내파의이은입니다.primes.ipynb이때부터 정기적으로 하는 것처럼 파일 내의 콘텐츠를 사용할 수 있습니다.

더 간단한 방법이 있으면 좋겠지만, 이것은 문서에서 직접 나온 것입니다.
참고: 저는 주피터 노티파이톤을 사용하고 있습니다.

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

기존 또는 새로운 Python.py 모듈에서 Jupyter를 사용하는 데 전혀 문제가 없습니다.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 파일을 변경할 때 이 코드가 작동합니다..ipynb 'module'을 다시 로드하려면 Jupyter 개발 환경을 다시 시작해야 할 것 같습니다. .ipynb 'module'은 제가 코드를 많이 변경하고 있기 때문에 받아들일 수 없었습니다.

다음 항목도 추가해야 합니다.__init__.py다른 모든 .ipynb 파일이 있는 패키지의 파일입니다.

은 "nbviewer"라는 입니다.minrk그리고.syi상기의

저도 비슷한 문제가 좀 있었는데 해결책과 함께 제 공용 구글 드라이브 폴더에 대한 링크를 작성했습니다. 이 폴더에는 작동 예가 있습니다. :)

단계별 실험 및 솔루션을 통한 My Stack 오버플로 게시물:

주피터 노트북:.ipynb 파일을 가져와서 다른 .ipynb 파일의 메서드에 액세스하면 오류가 발생합니다.

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

'%runchildNotebook.ipynb' 명령은 매우 간단하고 유용한 솔루션이지만(이전 답변에서 언급했듯이), 하위 파일에서도 다른 '%rungrandChildNotebook.ipynb'를 사용하지만 다른 디렉터리에 있을 때는 사용에 주의해야 합니다!파일이 중복 실행될 수 있으며 오류가 발생하기 쉽습니다(자녀가 더 이상 부모와 동일한 경로를 사용하지 않는 반면 주피터는 실행 중에 그렇게 가정합니다!).

위에서 언급한 문제를 해결하기 위한 한 가지 해결책은 다음과 같습니다. 파일을 가져오기 직전에 현재 디렉터리가 어디에 있는지 먼저 확인한 다음 이를 기반으로 작업하십시오.다음은 예입니다.

if 'myFolder' in os.getcwd():
    %run graindChildNotebook.ipynb
else:
    %run myFolder/grandChildNotebook.ipynb

위의 예에서는 먼저 'myFolder' 디렉토리에 있는지 확인합니다.그렇다면 '손자 노트북'이 같은 디렉터리에 있고 정상적으로 실행하기에 충분하다는 것을 알게 될 것입니다.그렇지 않으면 이 파일이 있는 폴더의 이름을 추가하여 실행해야 합니다.

이것은 단지 예시일 뿐이며, 당신은 당신의 사례를 바탕으로 개인화된 해결책을 수행해야 합니다.

언급URL : https://stackoverflow.com/questions/20186344/importing-an-ipynb-file-from-another-ipynb-file

반응형