Die Verwendung einer anderen Notebook-Funktion mit Jupyter Notebook wird auch auf der offiziellen Website und in Qiita vorgestellt. Ich werde Ihnen jedoch zeigen, wie Sie es etwas komfortabler gestalten können.
Es ist im Grunde das gleiche wie die offizielle Website. https://jupyter-notebook.readthedocs.io/en/latest/examples/Notebook/Importing%20Notebooks.html
Qiita hat auch einen guten Einführungsartikel. https://qiita.com/tdual/items/32d3918b4c8dd1f703e7
Die Schwierigkeit besteht jedoch darin, dass beim Importieren der gesamte Inhalt des Notizbuchs ausgeführt wird. Ich möchte nur die in einigen Zellen definierten Variablen und Funktionen anstelle aller Zellen in anderen Notizbüchern verwenden! Markieren Sie in fastais nbdev in einem solchen Fall "#export" am Anfang der Zelle. Aber ich möchte nicht wie nbdev übertreiben.
Ändern Sie daher die NotebookLoader-Klasse des Programms auf der offiziellen Website so, dass nur die am Anfang mit "#export" gekennzeichneten Zellen importiert werden.
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)
#Am Anfang der Zelle"#export"Führen Sie nur die als beschriebene Zelle aus
if code.startswith("#export"):
exec(code, mod.__dict__)
except Exception as ex:
#In der Zelle"#export"Ich vergesse oft hinzuzufügen, also lassen Sie mich wissen, wo der Fehler aufgetreten ist
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]
Speichern Sie dies mit einem Dateinamen wie nb_finder.py. Beim Benutzen
import sys
import nb_finder as nbf
sys.meta_path.append(nbf.NotebookFinder())
Danach können Sie andere Notebooks importieren.
from mynotebook import *
Fügen Sie im Import-Quellnotizbuch am Anfang der Zelle "#export" hinzu, das die Variablen und Funktionen beschreibt, die Sie in anderen Notizbüchern verwenden möchten. Vergessen Sie nicht, #export zu der Zelle hinzuzufügen, die die Importanweisung enthält, die zum Ausführen dieser Zelle erforderlich ist. Möglicherweise möchten Sie auch #hide für eine unerwünschte Zelle anstelle von #export angeben, um zu verhindern, dass diese Zelle importiert wird.
Recommended Posts