Comment utiliser une autre fonction de notebook avec Jupyter notebook est également présenté sur le site officiel et Qiita, mais je vais vous montrer comment le rendre un peu plus pratique.
C'est fondamentalement le même que le site officiel. https://jupyter-notebook.readthedocs.io/en/latest/examples/Notebook/Importing%20Notebooks.html
Qiita a également un bon article d'introduction. https://qiita.com/tdual/items/32d3918b4c8dd1f703e7
Cependant, la difficulté est que tout le contenu du notebook est exécuté lors de l'importation. Je souhaite utiliser uniquement les variables et fonctions définies dans certaines cellules au lieu de toutes les cellules d'autres blocs-notes! Dans [nbdev] de fastai (https://github.com/fastai/nbdev), dans un tel cas, marquez "#export" au début de la cellule. Mais je ne veux pas exagérer comme nbdev.
Donc, modifiez la classe NotebookLoader du programme sur le site officiel afin que seules les cellules marquées "#export" au début soient importées.
import io, os, sys, types
from IPython import get_ipython
from nbformat import read
from IPython.core.interactiveshell import InteractiveShell
def find_notebook(fullname, path=None):
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
nb_path = nb_path.replace("_", " ")
if os.path.isfile(nb_path):
return nb_path
class NotebookLoader(object):
def __init__(self, path=None):
self.shell = InteractiveShell.instance()
self.path = path
def load_module(self, fullname):
path = find_notebook(fullname, self.path)
with io.open(path, 'r', encoding='utf-8') as f:
nb = read(f, 4)
mod = types.ModuleType(fullname)
mod.__file__ = path
mod.__loader__ = self
mod.__dict__['get_ipython'] = get_ipython
sys.modules[fullname] = mod
save_user_ns = self.shell.user_ns
self.shell.user_ns = mod.__dict__
try:
for cell in nb.cells:
if cell.cell_type == 'code':
code = self.shell.input_transformer_manager.transform_cell(cell.source)
#Au début de la cellule"#export"Exécutez uniquement la cellule décrite comme
if code.startswith("#export"):
exec(code, mod.__dict__)
except Exception as ex:
#Dans la cellule"#export"J'oublie souvent d'ajouter, alors faites-moi savoir où l'erreur s'est produite
print(code)
raise ex
finally:
self.shell.user_ns = save_user_ns
return mod
class NotebookFinder(object):
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]
Enregistrez-le sous un nom de fichier tel que nb_finder.py. Lors de l'utilisation
import sys
import nb_finder as nbf
sys.meta_path.append(nbf.NotebookFinder())
Ensuite, vous pouvez importer d'autres blocs-notes après cela.
from mynotebook import *
Dans le bloc-notes source d'importation, ajoutez «#export» au début de la cellule qui décrit les variables et les fonctions que vous souhaitez utiliser dans d'autres blocs-notes. N'oubliez pas d'ajouter #export à la cellule contenant l'instruction d'importation nécessaire pour exécuter cette cellule. Vous pouvez également spécifier #hide pour une cellule indésirable au lieu de #export pour empêcher cette cellule d'être importée.
Recommended Posts