Interactive Python (ipython) est tout simplement incroyable, surtout que vous assemblez des objets à la volée ... et que vous le faites 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 cahiers ipython (fichiers ipynb). Apparemment, il semble qu'un ordinateur portable N'EST PAS censé entretenir une relation avec d'autres ordinateurs portables, ce qui est logique, sauf que j'aimerais importer d'autres fichiers ipynb.
La seule solution que je vois est la conversion de mes fichiers * .ipynb en fichiers * .py, qui peuvent ensuite être importés dans mon bloc-notes. Avoir un fichier contenant tout dans un projet est un peu bizarre, surtout si je veux vraiment encourager 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 ordinateurs portables ipython? Existe-t-il une autre solution que je peux utiliser pour importer un fichier ipynb dans un autre ordinateur portable? J'adorerais continuer à utiliser ipynb, mais cela me gêne vraiment dans mon flux de travail en ce moment :(
C'est très simple dans Jupyter plus récent:
%run MyOtherNotebook.ipynb
Courir
!pip install ipynb
puis importez l'autre cahier sous le nom
from ipynb.fs.full.<notebook_name> import *
ou
from ipynb.fs.full.<notebook_name> import <function_name>
Assurez-vous que tous les cahiers sont dans le même répertoire.
Le problème est qu'un cahier n'est pas un simple fichier python. Les étapes pour importer le fichier .ipynb
sont décrites dans les sections suivantes: Importation du bloc-notes
Je colle le code, donc si vous en avez besoin ... vous pouvez simplement faire un copier-coller rapide. Notez qu'à la fin, j'ai l'instruction import primes
. Vous devrez changer cela bien sûr. Le nom de mon fichier est primes.ipynb
. À partir de ce moment, vous pouvez utiliser le contenu de ce fichier comme vous le feriez régulièrement.
J'aurais bien aimé avoir une méthode plus simple, mais celle-ci provient directement 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
Les commentaires mentionnés ci-dessus sont très utiles mais ils sont un peu difficiles à mettre en œuvre. Vous pouvez essayer ci-dessous les étapes, j'ai également essayé et cela a fonctionné:
Assurez-vous également que vous ajoutez également un fichier __init__.py
dans le package contenant tous vos autres fichiers .ipynb.
Cela s'ajoute au lien nbviewer que minrk
et syi
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 contient un exemple de travail :)
Mon post Stackoverflow avec une expérimentation et une solution étape par étape:
J'espère que cela aidera les autres aussi . Merci à tous!
Il n’ya aucun problème à utiliser Jupyter avec les modules Python .py existants ou nouveaux. Avec Jupyter en marche, lancez simplement Spyder (ou n’importe quel éditeur de votre choix) pour construire/modifier vos définitions de classes de modules dans un fichier .py, puis importez simplement les modules nécessaires dans Jupyter.
L’utilisation de l’extension Magic à chargement automatique est une des choses qui rend cette opération vraiment transparente. Vous pouvez voir la documentation sur le chargement automatique ici:
http://ipython.readthedocs.io/fr/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 que cela fonctionnait bien, mais cela s’étouffe lorsque vous modifiez le fichier .ipynb. Il semble que vous ayez besoin de redémarrer l'environnement de développement Jupyter pour pouvoir recharger le 'module' .ipynb, ce qui n'était pas acceptable pour moi car j'apporte beaucoup de modifications à mon code.
Vous pouvez utiliser import nbimporter
puis import notebookName