Wenn Sie Datenanalysen durchführen oder mit einem Jupyter-Notizbuch experimentieren, möchten Sie häufig bestimmte Zellen aus anderen Notizbüchern importieren, die Klassen für die Analyse usw. definieren. Hier sind zwei Möglichkeiten, die funktionieren könnten.
Am einfachsten ist es, den magischen Befehl "%% writefile" zu verwenden. Der Inhalt der Zelle wird in "Dateiname" kopiert, indem am Anfang der Zelle "%% Schreibdatei-Dateiname" festgelegt wird. Jetzt müssen Sie nur noch den Dateinamen von einem anderen Notizbuch importieren.
Zelle, die Sie aus einem anderen Notizbuch lesen möchten
%%writefile hoge.py
class Hoge:
def __init__(self):
print('Hello from Hoge')
Lesen und verwenden Sie den Inhalt anderer Ausgabe-Notebookzellen
import hoge
x = hoge.Hoge()
Official sagt: "Jeder möchte es tun, und er muss sich nicht nur mit einer öffentlichen API darum kümmern. Wenn Sie sagen "Sie können es tun!" ~~, möchte ich, dass Sie es mit nur einem Befehl ~~ tun können, also werde ich es selbst machen, indem ich auf den verknüpften Code [^ t dual] verweise.
[^ tdual]: @tdual hat Artikel über den Inhalt des Links geschrieben. Nach der Untersuchung scheint der in @ tduals Artikel veröffentlichte Code (dh der offiziell eingeführte Code) mit Legacy-Code gemischt zu sein, der seit Python 3.4 veraltet ist, sodass Modcell einige Änderungen vorgenommen hat. ____ ist drinnen. Wenn modcell aufgrund der Version nicht funktioniert, sollten Sie den Code von @ tdual ausprobieren.
Der verknüpfte Code führt alle Codezellen des als Modul geladenen Notebooks aus. Versuchen Sie daher, ihn so zu ändern, dass die Zelle mit "# modcell" im Kommentar am Anfang der Codezelle identifiziert und geladen wird. Es war.
Bitte verwenden Sie es, wenn Sie möchten, da es als Bibliothek namens "modcell" veröffentlicht wurde.
(Wenn Sie danach suchen, sollte es Leute geben, die clevere Bibliotheken erstellen als ich. Wenn also jemand eine gute Bibliothek kennt, würde ich es begrüßen, wenn Sie mich wissen lassen könnten.)
Usage
modcell
sucht nach Dateien mit der Erweiterung .ipynb
, die in dem in sys.path
registrierten Verzeichnis vorhanden sind, und wird in die erste Zeile (ohne magische Befehle) der Codezelle geschrieben. Identifiziert den Kommentar "# modcell" und importiert ihn als Modul.
pip install modcell
Beim Importieren des Moduls "modcell" wird "sys.meta_path" ein Loader hinzugefügt, um ".ipynb" zu laden. Danach können Dateien mit der Erweiterung ".ipynb" importiert werden.
import modcell as mods
Beim Importieren mit einem Namen ohne Erweiterung werden wie bei einem normalen Modul alle Zellen mit "# modcell" am Anfang der Zelle importiert (mit Ausnahme des magischen Befehls IPython).
Notizbuch auf der importierten Seite(test_module.ipynb)Eine bestimmte Zelle
# modcell
class TestModule:
def __init__(self):
pass
def hello(self):
print('Hello from TestModule')
Eine bestimmte Zelle im Notizbuch auf der Importseite
import test_module as mod
x = mod.TestModule()
x.hello()
modcell
ignoriert IPython Magic-Befehle (Zeilen beginnend mit!
Or%
). Mit anderen Worten, "% autoreload" und "%% time" werden beim Importieren durch "modcell" nicht ausgeführt.
Außerdem weiß ich nicht, ob modcell
selbst% autoreload
unterstützt, da ich es nicht getestet habe. Wir haben bestätigt, dass andere Notebooks neu geladen werden, wenn Sie "Alle neu starten und ausführen" ausführen.
Aufwärtskompatibel mit %% writefile
. Gibt alle importierten Zellen in eine Datei aus.
import modcell as mods
import test_module
with open('module.py', mode='w') as f:
mods.compile(out=f, source_info=True)
Es ist wie folgt formatiert.
module.py
# test_module.ipynb ---------
# ---
class TestModule:
def __init__(self):
pass
def hello(self):
print('Hello from TestModule')
# ---
# --------- test_module.ipynb
Der der Zelle entsprechende begrenzte Kommentar wird unter dem Gesichtspunkt des Debuggens usw. ausgegeben. Wenn er jedoch im Weg ist, wird er nicht ausgegeben, wenn "source_info = False" angegeben ist.
Schreiben Sie einen Kommentar am Anfang der Zelle
test_module.Eine bestimmte Zelle von Ipynb
# modcell: tagname
class TestModule:
def __init__(self):
pass
def hello(self):
print('Hello from TestModule')
Sie können jeder Zelle nur ein Tag hinzufügen, indem Sie die Syntax von verwenden. Beim Importieren
import modcell as mods
mod = mods._import('test_module', tag='tagname')
x = mod.TestModule().hello()
Auf diese Weise können nur Zellen mit dem Tag "Tagname" gelesen werden.
Standardmäßig erstellt "modcell" eine Instanz der "modcell.ModCell" -Klasse, und alle Funktionen werden als Methoden dieser Standardinstanz ausgeführt. Diese Standardinstanz kann mit der Funktion modcell.default ()
abgerufen werden, wird jedoch für die Benutzerinteraktion nicht empfohlen.
Benutzer können nach Bedarf mehrere ModCell-Instanzen erstellen.
import modcell as mods
mod_1 = mods.ModCell()
mod_2 = mods.ModCell()
...
Mit anderen Worten, Sie können mehrere ".py" -Dateien aus mehreren ".ipynb" -Dateien generieren, indem Sie den folgenden Code ausführen.
import modcell as mods
mod_debug = mods.ModCell()
nb1_debug = mod_debug._import('notebook_1', tag='debug')
nb2 = mod_debug._import('notebook_2')
nb3 = mod_debug._import('notebook_3')
with open('../module/mod_debug.py', mode='w') as f:
mod_debug.compile(out=f)
mod_test = mods.ModCell()
nb1_test = mod_test._import('notebook_1', tag='test')
nb4 = mod_test._import('notebook_4')
with open('../module/mod_test.py', mode='w') as f:
mod_test.compile(out=f)
Eine andere Möglichkeit, die ich mir ausgedacht habe, bestand darin, "eine Verbindung zum IPython-Kernel herzustellen und den Inhalt der Codezellen anderer Notebooks abzurufen", aber es scheint, dass der Inhalt der Codezellen vom Front-End-JavaScript beibehalten wird. Der IPython-Kernel scheint jedoch nur den Code nach dem Parser zu enthalten, daher war dies eine schlechte Idee.
https://stackoverflow.com/questions/51121647/get-the-current-contents-of-the-entire-jupyter-notebook
Recommended Posts