Le Python interactif (ipython) est tout simplement incroyable, d'autant plus que vous assemblez des choses à la volée ... et le fait de manière à ce qu'il soit facile de revenir en arrière.
Cependant, ce qui semble intéressant, c'est le cas d'utilisation de plusieurs blocs-notes ipython (fichiers ipynb). Il semble apparemment qu'un ordinateur portable n'est PAS censé avoir une relation avec d'autres ordinateurs portables, ce qui est logique, sauf que j'aimerais importer d'autres fichiers ipynb.
La seule solution de contournement que je vois est de convertir mes fichiers * .ipynb en fichiers * .py, qui peuvent ensuite être importés dans mon ordinateur portable. Avoir un fichier contenant tout dans un projet est un peu étrange, surtout si je veux vraiment pousser pour la réutilisation du 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 pris en charge des blocs-notes ipython? Existe-t-il une autre solution que je peux utiliser pour cette importation d'un fichier ipynb dans un autre notebook? J'adorerais continuer à utiliser ipynb, mais cela perturbe vraiment mon flux de travail en ce moment :(
--script
pour enregistrer des copies .py de vos notebooks. Dans IPython 2.0, vous pourrez créer%run
un notebook. Nous travaillons toujours à de meilleurs mécanismes pour la réutilisation du code.Réponses:
C'est vraiment simple dans le nouveau Jupyter:
la source
__name__ == '__main__' and '__file__' not in globals()
pour vérifier si vous êtes dans le bloc-notes enfant. (de blog.sicara.com/… )u'MyOtherNotebook.ipynb.py'
introuvable.Si vous souhaitez importer
A.ipynb
enB.ipynb
écritureimport import_ipynb import A
dans
B.ipynb
.Le
import_ipynb
module que j'ai créé est installé via pip:Ce n'est qu'un fichier et il adhère strictement au howto officiel sur le site jupyter.
PS Il prend également en charge des choses comme
from A import foo
,from A import *
etc.la source
pip install import-ipynb
fonctionne également et installe le même package, mais comme python ne vous permet pas d'écrireimport import-ipynb
et considérant qu'il ne s'agit que d'un seul fichier, celapip install import_ipynb
me semble plus cohérent.import nbimporter
etimport import_ipynb
?Courir
!pip install ipynb
puis importez l'autre notebook sous
from ipynb.fs.full.<notebook_name> import *
ou
from ipynb.fs.full.<notebook_name> import <function_name>
Assurez-vous que tous les blocs-notes sont dans le même répertoire.
Edit 1: Vous pouvez voir la documentation officielle ici - https://ipynb.readthedocs.io/en/stable/
De plus, si vous souhaitez importer uniquement des définitions de classe et de fonction à partir d'un notebook (et non les instructions de niveau supérieur), vous pouvez utiliser à la
ipynb.fs.defs
place deipynb.fs.full
. L'affectation complète des variables majuscules sera également évaluée.la source
ipynb
package prend également en charge l'exécution partielle des définitions uniquement. C'est un paquet officiel d'IPyhton, donc je pense que cela devrait être la réponse acceptée.MyFolder/book.ipynb
Installez ipynb à partir de votre invite de commande
pip install import-ipynb
Importez dans votre fichier notebook
import import_ipynb
Maintenant, utilisez la commande d'importation régulière pour importer votre fichier
import MyOtherNotebook
la source
Vous pouvez utiliser
import nbimporter
alorsimport notebookName
la source
conda install -c conda-forge importnb
Les commentaires mentionnés ci-dessus sont très utiles mais ils sont un peu difficiles à mettre en œuvre. Ci-dessous les étapes que vous pouvez essayer, je l'ai également essayé et cela a fonctionné:
la source
import callee
, je ne pouvais tout simplement pas travail.Le problème est qu'un notebook n'est pas un simple fichier Python. Les étapes d'importation du
.ipynb
fichier sont décrites ci-dessous: Importation du bloc-notesJe suis en train de coller le code, donc si vous en avez besoin ... vous pouvez simplement faire un copier-coller rapide. Remarquez qu'à la fin j'ai la
import primes
déclaration. Vous devrez bien sûr changer cela. Le nom de mon fichier estprimes.ipynb
. À partir de ce moment, vous pouvez utiliser le contenu de ce fichier comme vous le feriez régulièrement.J'aurais aimé qu'il y ait une méthode plus simple, mais cela vient directement de la documentation.
Remarque: j'utilise jupyter et non 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
la source
Il n'y a aucun problème à utiliser Jupyter avec des modules Python .py existants ou nouveaux. Avec Jupyter en cours d'exécution, lancez simplement Spyder (ou n'importe quel éditeur de votre choix) pour créer / modifier vos définitions de classe de module dans un fichier .py, puis importez simplement les modules selon vos besoins dans Jupyter.
Une chose qui rend cela vraiment transparent est l'utilisation de l'extension magique de chargement automatique. Vous pouvez voir la documentation pour le chargement automatique 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 de fichiers .ipynb en tant que modules, et je l'ai fait fonctionner, mais cela s'étouffe lorsque vous apportez des modifications au fichier .ipynb. Il semble que vous deviez redémarrer l'environnement de développement Jupyter afin de recharger le «module» .ipynb, ce qui n'était pas acceptable pour moi car j'apporte beaucoup de modifications à mon code.
la source
Veuillez vous assurer que vous ajoutez également un
__init__.py
fichier dans le package où se trouvent tous vos autres fichiers .ipynb.Ceci est en plus le lien qui nbviewer
minrk
etsyi
fourni ci - dessus.J'ai également eu un problème similaire, puis j'ai écrit la solution ainsi qu'un lien vers mon dossier public google drive qui a un exemple fonctionnel :)
Mon article Stackoverflow avec expérimentation étape par étape et solution:
Jupyter Notebook: importez le fichier .ipynb et accédez à sa méthode dans un autre fichier .ipynb en donnant une erreur
J'espère que cela aidera également les autres. Merci a tous!
la source