web-dev-qa-db-ger.com

ipynb importiert eine andere ipynb-Datei

Interaktives Python (ipython) ist einfach umwerfend, vor allem, wenn Sie die Dinge im Handumdrehen zusammensetzen ... und dies so tun, dass Sie leicht zurückgehen können.

Was jedoch interessant erscheint, ist der Anwendungsfall mehrerer ipython-Notebooks (ipynb-Dateien). Es scheint, als würde ein Notebook KEINE Beziehung zu anderen Notebooks haben, was Sinn macht, außer dass ich gerne andere ipynb-Dateien importieren würde.

Die einzige Problemumgehung, die ich sehe, ist das Konvertieren meiner * .ipynb-Dateien in * .py-Dateien, die dann in mein Notizbuch importiert werden können. Es ist ein bisschen komisch, wenn eine Datei alles in einem Projekt hält, vor allem, wenn ich wirklich zur Code-Wiederverwendung drücken möchte (ist das nicht ein Kerngedanke von Python?).

Fehlt mir etwas? Ist dies nicht ein unterstützter Anwendungsfall von ipython-Notebooks? Gibt es eine andere Lösung für diesen Import einer ipynb-Datei in ein anderes Notebook? Ich würde gerne weiter ipynb verwenden, aber es ist wirklich mein Workflow durcheinander :(

39
Andrew Harris

Im neueren Jupyter ist das ganz einfach:

%run MyOtherNotebook.ipynb
65
johndodo

Wenn Sie A.ipynb Aus B.ipynb Importieren möchten, schreiben Sie

import import_ipynb
import A

in B.ipynb.

Das von mir erstellte Modul import_ipynb Wird über pip installiert:

pip install import_ipynb

Es handelt sich nur um eine Datei, die sich strikt an das offizielle Howto auf der Jupyter-Site hält.

PS Es unterstützt auch Dinge wie from A import foo, from A import * Etc

17
axil

Lauf

!pip install ipynb

und importieren Sie dann das andere Notebook als

from ipynb.fs.full.<notebook_name> import *

oder

from ipynb.fs.full.<notebook_name> import <function_name>

Stellen Sie sicher, dass sich alle Notebooks im selben Verzeichnis befinden.

1
Malgo

Das Problem ist, dass ein Notizbuch keine normale Python-Datei ist. Die Schritte zum Importieren der .ipynb-Datei werden im Folgenden beschrieben: Notebook importieren

Ich füge den Code ein, also wenn Sie ihn brauchen ... können Sie einfach ein schnelles Kopieren und Einfügen machen. Beachten Sie, dass ich am Ende die import primes-Anweisung habe. Das musst du natürlich ändern. Der Name meiner Datei lautet primes.ipynb. Ab diesem Zeitpunkt können Sie den Inhalt dieser Datei wie gewohnt verwenden.

Ich wünschte, es gäbe eine einfachere Methode, aber dies ist direkt aus den Dokumenten.
Hinweis: Ich verwende jupyter, nicht 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
germ13

Die oben genannten Kommentare sind sehr nützlich, aber etwas schwer zu implementieren. Unten können Sie versuchen, ich habe es auch ausprobiert und es hat funktioniert: 

  1. Laden Sie diese Datei von Ihrem Notebook im PY-Dateiformat herunter (Sie finden diese Option auf der Registerkarte Datei).
  2. Kopieren Sie nun die heruntergeladene Datei in das Arbeitsverzeichnis von Jupyter Notebook
  3. Sie können es jetzt verwenden. Importieren Sie einfach .PY-Datei in die ipynb-Datei 
0
Yash Bansal

Stellen Sie sicher, dass Sie dem Paket auch eine __init__.py-Datei hinzufügen, in der sich alle anderen .ipynb-Dateien befinden.

Dies gilt zusätzlich zu dem oben angegebenen Link für nbviewer, der minrk und syi ist.

Ich hatte auch ein ähnliches Problem und schrieb dann die Lösung sowie einen Link zu meinem öffentlichen Google-Laufwerksordner, der ein funktionierendes Beispiel hat :)

Mein Stackoverflow-Post mit Schritt für Schritt Experimentieren und Lösung:

Jupyter Notebook: Import der .ipynb-Datei und Zugriff auf die Methode in einer anderen .ipynb-Datei, die einen Fehler anzeigt

Ich hoffe, dass dies auch anderen helfen wird ... Vielen Dank an alle!

0
anugrah

Es ist überhaupt kein Problem, Jupyter mit vorhandenen oder neuen Python .py-Modulen zu verwenden. Wenn Jupyter ausgeführt wird, starten Sie einfach Spyder (oder einen beliebigen Editor), um die Klassendefinitionen Ihrer Module in einer .py-Datei zu erstellen oder zu ändern, und importieren Sie die Module dann nach Bedarf in Jupyter.

Eine Sache, die das wirklich nahtlos macht, ist die Verwendung der magischen Erweiterung von Autoreload. Die Dokumentation zum Autoreload finden Sie hier:

http://ipython.readthedocs.io/de/stable/config/extensions/autoreload.html

Hier ist der Code, um das Modul bei jeder Änderung automatisch neu zu laden:

# autoreload sets up auto reloading of modified .py modules
import autoreload
%load_ext autoreload
%autoreload 2

Beachten Sie, dass ich den in einer früheren Antwort genannten Code ausprobiert habe, um das Laden von .ipynb-Dateien als Module zu simulieren, und dass es funktioniert, aber es verschluckt sich, wenn Sie Änderungen an der .ipynb-Datei vornehmen. Es scheint, dass Sie die Jupyter-Entwicklungsumgebung neu starten müssen, um das .ipynb-Modul erneut zu laden. Dies war für mich nicht akzeptabel, da ich viele Änderungen an meinem Code vornehme.

0
David Miller

Installieren Sie ipynb über die Eingabeaufforderung

pip install import-ipynb

Import in Ihre Notebook-Datei

import import_ipynb

Verwenden Sie jetzt den regulären Importbefehl, um Ihre Datei zu importieren

import MyOtherNotebook
0
outofworld

Sie können import nbimporter und dann import notebookName verwenden.

0
Fractale