ipynb importer un autre fichier ipynb

Python interactif (ipython) est tout simplement incroyable, d'autant plus que vous assemblez les choses à la volée... et il le fait de telle manière qu'il est facile de revenir en arrière.

cependant, ce qui semble intéressant est le cas d'utilisation de plusieurs ordinateurs portables ipython (fichiers ipynb). Il semble apparemment comme un carnet n'est pas censé avoir une relation avec d'autres carnets, ce qui a du sens, sauf que j'aimerais importer d'autres fichiers ipynb.

la seule solution que je vois est de convertir mon *.ipynb file into *.les fichiers py, qui peuvent ensuite être importés dans mon carnet. Avoir un fichier tout en un projet est un peu bizarre, surtout si je veux vraiment pousser pour réutiliser le code (n'est-ce pas un principe fondamental de python?).

est-ce que je manque quelque chose? N'est-ce pas un cas d'utilisation prise en charge des notebooks ipython? Y a-t-il une autre solution que je puisse utiliser pour cette importation d'un fichier ipynb dans un autre ordinateur portable? J'aimerais continuer à utiliser ipynb, mais il est vraiment gâcher mon flux de travail en ce moment: (

34
demandé sur minrk 2013-11-25 10:52:38

7 réponses

cet exemple montre comment importer des notebooks IPython sous forme de modules sans exporter des doublons sous forme de scripts.

15
répondu minrk 2016-02-21 06:38:36

C'est vraiment simple dans de nouveaux Jupyter:

%run MyOtherNotebook.ipynb
51
répondu johndodo 2018-05-28 12:11:16

si vous voulez importer A.ipynb de B.ipynb écrire

import import_ipynb
import A

dans B.ipynb .

le module import_ipynb que j'ai créé est installé via pip:

pip install import_ipynb

ce n'est qu'un fichier et il est strictement conforme au Official howto sur le site de jupyter.

PS il supporte aussi des choses comme from A import foo , from A import * etc

5
répondu axil 2017-11-29 17:10:51

le problème est qu'un notebooks n'est pas un simple fichier python. Les étapes à suivre pour importer le fichier .ipynb sont décrites ci-dessous: Importer un carnet

je suis en train de coller le code, donc si vous en avez besoin...vous pouvez simplement faire une copie rapide et coller. Notez qu'à la fin j'ai le import primes . Vous devrez bien sûr la modifier. Le nom de mon fichier est primes.ipynb . À partir de ce point, vous pouvez utiliser le contenu à l'intérieur qu' fichier comme vous le feriez régulièrement.

Souhaite qu'il y avait une méthode plus simple, mais c'est directement à partir de la documentation.

Note: j'utilise jupyter pas 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
répondu germ13 2015-09-22 00:17:46

il n'y a aucun problème à utiliser Jupyter avec un Python existant ou Nouveau .modules py. Avec Jupyter en cours d'exécution, lancez simplement Spyder (ou n'importe quel éditeur de votre choix) pour construire / modifier vos définitions de classe de module dans A. PY file, puis il suffit d'importer les modules au besoin dans Jupyter.

une chose qui rend cela vraiment fluide est d'utiliser l'extension magique autoreload. Vous pouvez voir la documentation pour autoreload ici:

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

voici le code pour recharger automatiquement le module chaque fois qu'il a été modifié:

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

notez que j'ai essayé le code mentionné dans une réponse précédente pour simuler le chargement .ipynb file en tant que modules, et l'a fait fonctionner, mais il étouffe quand vous faites des changements à la .fichier ipynb. Il semble que vous devez redémarrer l'Jupyter environnement de développement afin de recharger le .ipynb 'module', qui n'était pas acceptable pour moi car je fais beaucoup de modifications à mon code.

0
répondu David Miller 2016-06-28 17:51:15

les commentaires mentionnés ci-dessus sont très utiles mais un peu difficiles à mettre en œuvre. Ci-dessous, vous pouvez essayer, j'ai aussi essayé et ça a fonctionné:

  1. téléchargez ce fichier dans votre ordinateur portable au format PY (vous pouvez trouver cette option dans L'onglet Fichier).
  2. maintenant copier ce fichier téléchargé dans le répertoire de travail de carnet Jupyter
  3. Vous êtes maintenant prêt à utiliser. Importez .Fichier PY dans le fichier ipynb
0
répondu Yash Bansal 2016-12-17 23:50:31

s'il vous plaît assurez-vous que vous ajoutez également un fichier __init__.py dans le paquet où tous vos autres .les fichiers ipynb sont localisés.

ceci est en plus du lien nbviewer que minrk et syi fournis ci-dessus.

j'ai également eu un problème similaire et puis j'ai écrit la solution ainsi que d'un lien vers mon dossier public Google drive qui a un exemple de travail:)

mon poteau de débordement avec étape par étape expérimentation et Solution:

Jupyter Notebook: Import .ipynb de fichiers et d'y accéder de la méthode dans d'autres .ipynb fichier donnant erreur

espérons que cela aidera les autres aussi. Merci à tous!

0
répondu anugrah 2017-06-06 15:09:35