Was ist eine gute Strategie, um IPython- Notebooks unter Versionskontrolle zu halten?
Das Notebook-Format eignet sich gut für die Versionskontrolle: Wenn man das Notebook und die Ausgänge versionieren möchte, funktioniert dies recht gut. Der Ärger entsteht, wenn man nur die Version der Eingabe steuern möchte, mit Ausnahme der Zellenausgaben (auch "Build-Produkte" genannt), bei denen es sich um große binäre Blobs handeln kann, insbesondere für Filme und Handlungen. Insbesondere versuche ich, einen guten Workflow zu finden, der:
- ermöglicht mir die Wahl zwischen Einschließen oder Ausschließen von Ausgaben,
- verhindert, dass ich versehentlich eine Ausgabe festschreibe, wenn ich es nicht will,
- ermöglicht es mir, die Ausgabe in meiner lokalen Version zu behalten,
- ermöglicht es mir zu sehen, wann ich Änderungen an den Eingaben mit meinem Versionskontrollsystem habe (dh wenn ich nur die Eingaben versioniere, aber meine lokale Datei Ausgaben hat, möchte ich in der Lage sein zu sehen, ob sich die Eingaben geändert haben (was ein Commit erfordert) ) Bei Verwendung des Versionskontrollstatusbefehls wird immer ein Unterschied registriert, da die lokale Datei Ausgänge hat.)
- ermöglicht es mir, mein Arbeitsnotizbuch (das die Ausgabe enthält) von einem aktualisierten sauberen Notizbuch zu aktualisieren. (aktualisieren)
Wie bereits erwähnt, ist alles in Ordnung , wenn ich die Ausgaben einbeziehe (was beispielsweise bei Verwendung von nbviewer wünschenswert ist). Das Problem ist, wenn ich die Ausgabe nicht versionieren möchte. Es gibt einige Tools und Skripte zum Entfernen der Ausgabe des Notebooks, aber häufig treten die folgenden Probleme auf:
- Ich habe versehentlich eine Version mit der Ausgabe festgeschrieben, wodurch mein Repository verschmutzt wird.
- Ich lösche die Ausgabe, um die Versionskontrolle zu verwenden, möchte die Ausgabe jedoch lieber in meiner lokalen Kopie behalten (manchmal dauert die Reproduktion beispielsweise eine Weile).
- Einige der Skripte, die die Ausgabe
Cell/All Output/Clear
entfernen, ändern das Format im Vergleich zur Menüoption geringfügig , wodurch unerwünschte Störungen in den Diffs entstehen. Dies wird durch einige der Antworten gelöst. - Wenn ich Änderungen an einer sauberen Version der Datei abrufe, muss ich eine Möglichkeit finden, diese Änderungen in mein Arbeitsnotizbuch aufzunehmen, ohne alles erneut ausführen zu müssen. (aktualisieren)
Ich habe einige Optionen in Betracht gezogen, die ich unten diskutieren werde, habe aber noch keine gute umfassende Lösung gefunden. Eine vollständige Lösung erfordert möglicherweise einige Änderungen an IPython oder basiert auf einfachen externen Skripten. Ich verwende derzeit Mercurial , möchte aber eine Lösung, die auch mit Git funktioniert : Eine ideale Lösung wäre Agnostic mit Versionskontrolle.
Dieses Problem wurde schon oft diskutiert, aber aus Sicht des Benutzers gibt es keine endgültige oder klare Lösung. Die Antwort auf diese Frage sollte die endgültige Strategie liefern. Es ist in Ordnung, wenn eine aktuelle (sogar Entwicklungs-) Version von IPython oder eine einfach zu installierende Erweiterung erforderlich ist .
Update: Ich habe mit meiner modifizierten Notebook- Version gespielt, die optional .clean
bei jedem Speichern eine Version mit den Vorschlägen von Gregory Crosswhite speichert . Dies erfüllt die meisten meiner Einschränkungen, lässt jedoch Folgendes ungelöst:
- Dies ist noch keine Standardlösung (erfordert eine Änderung der Ipython-Quelle. Gibt es eine Möglichkeit, dieses Verhalten mit einer einfachen Erweiterung zu erreichen? Benötigt eine Art On-Save-Hook.
- Ein Problem, das ich mit dem aktuellen Workflow habe, ist das Abrufen von Änderungen. Diese werden in die
.clean
Datei aufgenommen und müssen dann irgendwie in meine Arbeitsversion integriert werden. (Natürlich kann ich das Notizbuch jederzeit erneut ausführen, aber dies kann schmerzhaft sein, insbesondere wenn einige der Ergebnisse von langen Berechnungen, parallelen Berechnungen usw. abhängen.) Ich habe noch keine gute Idee, wie dies behoben werden kann . Vielleicht funktioniert ein Workflow mit einer Erweiterung wie ipycache , aber das scheint etwas zu kompliziert.
Anmerkungen
Ausgang entfernen (entfernen)
- Wenn das Notebook läuft, können Sie die
Cell/All Output/Clear
Menüoption zum Entfernen der Ausgabe verwenden. - Es gibt einige Skripte zum Entfernen der Ausgabe, z. B. das Skript nbstripout.py, das die Ausgabe entfernt, jedoch nicht die gleiche Ausgabe wie bei Verwendung der Notebook-Oberfläche erzeugt. Dies wurde schließlich in das Repo von ipython / nbconvert aufgenommen , aber dies wurde geschlossen, da die Änderungen jetzt in ipython / ipython enthalten sind, die entsprechende Funktionalität jedoch noch nicht enthalten zu sein scheint. (Update) That being said, Gregory Crosswhite-Lösung zeigt , dass dies recht einfach zu tun, auch ohne Berufung auf ipython / nbconvertDaher ist dieser Ansatz wahrscheinlich praktikabel, wenn er ordnungsgemäß angeschlossen werden kann. (Das Anschließen an jedes Versionskontrollsystem scheint jedoch keine gute Idee zu sein - dies sollte sich irgendwie in den Notebook-Mechanismus einfügen.)
Newsgroups
Probleme
- 977: Anforderungen an Notebook-Funktionen (offen) .
- 1280: Option "Alles beim Speichern löschen" (Öffnen) . (Folgt aus dieser Diskussion .)
- 3295: Autoexportierte Notizbücher: Exportieren Sie nur explizit markierte Zellen (geschlossen) . Gelöst durch Erweiterung 11 Add writeandexecute magic (Merged) .
Anfragen ziehen
- 1621: clear In [] Eingabeaufforderungsnummern bei "Clear All Output" (Zusammengeführt) . (Siehe auch 2519 (zusammengeführt) .)
- 1563: clear_output Verbesserungen (zusammengeführt) .
- 3065: Diff-Fähigkeit von Notebooks (geschlossen) .
- 3291: Fügen Sie die Option hinzu, um Ausgabezellen beim Speichern zu überspringen. (Geschlossen) . Dies scheint äußerst relevant zu sein, wurde jedoch mit dem Vorschlag abgeschlossen, einen "Clean / Smudge" -Filter zu verwenden. Eine relevante Frage, was können Sie verwenden, wenn Sie die Ausgabe entfernen möchten, bevor Sie git diff ausführen? scheint nicht beantwortet worden zu sein.
- 3312: WIP: Notebook-Speicherhaken (geschlossen) .
- 3747: ipynb -> ipynb-Transformator (geschlossen) . Dies wird in 4175 neu basiert .
- 4175: nbconvert: Jinjaless-Exportbasis (zusammengeführt) .
- 142: Verwenden Sie STDIN in nbstripout, wenn keine Eingabe erfolgt (Open) .
quelle
--script
Option entscheiden, aber die wurde entfernt. Ich warte, bis Post-Save-Hooks implementiert sind ( die geplant sind ). An diesem Punkt denke ich, dass ich in der Lage sein werde, eine akzeptable Lösung bereitzustellen, die mehrere der Techniken kombiniert.Antworten:
Hier ist meine Lösung mit Git. Sie können wie gewohnt einfach hinzufügen und festschreiben (und diff): Diese Vorgänge ändern Ihren Arbeitsbaum nicht, und gleichzeitig (erneutes) Ausführen eines Notizbuchs ändert sich Ihr Git-Verlauf nicht.
Obwohl dies wahrscheinlich an andere VCS angepasst werden kann, weiß ich, dass es Ihren Anforderungen nicht entspricht (zumindest der VSC-Agnostizität). Trotzdem ist es perfekt für mich, und obwohl es nichts besonders Geniales ist und viele Leute es wahrscheinlich bereits verwenden, habe ich keine klaren Anweisungen gefunden, wie man es durch Googeln umsetzt. So kann es für andere Menschen nützlich sein.
~/bin/ipynb_output_filter.py
)chmod +x ~/bin/ipynb_output_filter.py
)Erstellen Sie die Datei
~/.gitattributes
mit dem folgenden InhaltFühren Sie die folgenden Befehle aus:
Erledigt!
Einschränkungen:
somebranch
und dies tungit checkout otherbranch; git checkout somebranch
, erwarten Sie normalerweise, dass der Arbeitsbaum unverändert bleibt. Hier haben Sie stattdessen die Ausgabe und die Zellennummerierung von Notebooks verloren, deren Quelle sich zwischen den beiden Zweigen unterscheidet.git commit notebook_file.ipynb
, obwohl es zumindestgit diff notebook_file.ipynb
frei von Base64-Müll bleiben würde ).Meine Lösung spiegelt die Tatsache wider, dass ich persönlich generierte Inhalte nicht gerne versioniert halte. Beachten Sie, dass das Zusammenführen mit der Ausgabe fast garantiert die Ausgabe oder Ihre Produktivität oder beides ungültig macht .
BEARBEITEN:
Wenn Sie die Lösung so übernehmen, wie ich es vorgeschlagen habe - das heißt global -, werden Sie Probleme haben, falls Sie für ein Git-Repo die Ausgabe versionieren möchten . Wenn Sie also die Ausgabefilterung für ein bestimmtes Git-Repository deaktivieren möchten , erstellen Sie einfach eine Datei .git / info / attribute mit
**. ipynb filter =
als Inhalt. Auf die gleiche Weise ist es natürlich möglich, das Gegenteil zu tun: Aktivieren Sie die Filterung nur für ein bestimmtes Repository.
Der Code wird jetzt in einem eigenen Git-Repo verwaltet
Wenn die obigen Anweisungen zu ImportErrors führen, fügen Sie vor dem Pfad des Skripts "ipython" hinzu:
BEARBEITEN : Mai 2016 (aktualisiert im Februar 2017): Es gibt verschiedene Alternativen zu meinem Skript. Der Vollständigkeit halber finden Sie hier eine Liste der mir bekannten: nbstripout ( andere Varianten ), nbstrip , jq .
quelle
ImportError
ich das oben Gesagte ändern, um mit ipython zu laufen:git config --global filter.dropoutput_ipynb.clean ipython ~/bin/ipynb_output_filter.py
~/.gitattributes
anderen Leuten, die dieselben Filter haben wie ich 2 ) Ich habe den regulären Ausdruck als definiertworkdir/**/*.ipynb filter=dropoutput_ipynb
und die meisten meiner Notizbücher in workdir / => abgelegt. Wenn ich dennoch ein Notizbuch mit der Ausgabe verschieben und das Lesezeichen-Rendern in Github genießen möchte, lege ich es einfach außerhalb dieses Ordners ab.Wir haben ein Gemeinschaftsprojekt, in dem das Produkt Jupyter Notebooks ist, und wir verwenden seit sechs Monaten einen Ansatz, der hervorragend funktioniert: Wir aktivieren das
.py
automatische Speichern der Dateien und verfolgen sowohl.ipynb
Dateien als auch.py
Dateien.Auf diese Weise kann jemand, der das neueste Notizbuch anzeigen / herunterladen möchte, dies über github oder nbviewer tun. Wenn jemand sehen möchte, wie sich der Notizbuchcode geändert hat, kann er sich nur die Änderungen an den
.py
Dateien ansehen .Bei
Jupyter
Notebook-Servern kann dies durch Hinzufügen der Zeilen erreicht werdenin die
jupyter_notebook_config.py
Datei und starten Sie den Notebook-Server neu.Falls Sie nicht sicher sind , in welchem Verzeichnis Ihr finden
jupyter_notebook_config.py
Datei können Sie gebenjupyter --config-dir
, und wenn Sie die Datei nicht dort finden, können Sie es durch Eingabe erstellenjupyter notebook --generate-config
.Bei
Ipython 3
Notebook-Servern kann dies durch Hinzufügen der Zeilen erreicht werdenin die
ipython_notebook_config.py
Datei und starten Sie den Notebook-Server neu. Diese Zeilen stammen aus einer Antwort von Github, die von @minrk bereitgestellt wurde, und @dror nimmt sie auch in seine SO-Antwort auf.Bei
Ipython 2
Notebook-Servern kann dies erreicht werden, indem der Server wie folgt gestartet wird:oder durch Hinzufügen der Zeile
in die
ipython_notebook_config.py
Datei und starten Sie den Notebook-Server neu.Falls Sie nicht sicher sind , in welchem Verzeichnis Ihr finden
ipython_notebook_config.py
Datei können Sie gebenipython locate profile default
, und wenn Sie die Datei nicht dort finden, können Sie es durch Eingabe erstellenipython profile create
.Hier ist unser Projekt zu Github, das diesen Ansatz verwendet : und hier ist ein Github-Beispiel für die Untersuchung der letzten Änderungen an einem Notebook .
Wir waren sehr zufrieden damit.
quelle
--script
in der Praxis funktioniert hat. Das Problem dabei ist, dass die tatsächlichen Notebooks sehr groß sein können, wenn Bilder aufbewahrt werden. Eine ideale Lösung auf diesem Weg könnte so etwas wie Git-Annex verwenden , um nur das neueste vollständige Notebook im Auge zu behalten.--script
ist das veraltet. ipython.org/ipython-doc/3/whatsnew/version3.htmljupyter notebook --generate-config
, um eine Konfigurationsdatei zu erstellen. Der Befehl ermitteltjupyter --config-dir
, welches Verzeichnis die Konfigurationsdateien enthält. Und das von @Rich angegebene Code-Snippet sollte der genannten Datei hinzugefügt werdenjupyter_notebook_config.py
. Der Rest funktioniert wie bisher.check_call(['ipython'
mitcheck_call(['jupyter'
, sonst erhalten Sie eine Warnung erhalten, istipython nbconvert
veraltet und Sie sollten verwendenjupyter nbconvert
statt. (Jupyter v4.1.0, iPython v4.1.2)Ich habe
nbstripout
basierend auf MinRKs Gist erstellt , das sowohl Git als auch Mercurial unterstützt (dank mforbes). Es soll entweder eigenständig in der Befehlszeile oder als Filter verwendet werden, der einfach übernbstripout install
/ im aktuellen Repository ( / ) installiert werden kannnbstripout uninstall
.Erhalten Sie es von PyPI oder einfach
quelle
nbstripout
unterstützt diesen Anwendungsfall nicht einfach, da er auf dem JSON-Format des Notebooks basiert. Sie sind wahrscheinlich besser dran, ein Skript zu schreiben, das auf Ihren Anwendungsfall spezialisiert ist.Hier ist eine neue Lösung von Cyrille Rossant für IPython 3.0, die weiterhin Markdown-Dateien anstelle von json-basierten ipymd-Dateien enthält:
https://github.com/rossant/ipymd
quelle
Nachdem ich einige Jahre lang Ausgaben in Notebooks entfernt hatte, habe ich versucht, eine bessere Lösung zu finden. Ich verwende jetzt Jupytext , eine Erweiterung für Jupyter Notebook und Jupyter Lab, die ich entworfen habe.
Jupytext kann Jupyter-Notizbücher in verschiedene Textformate (Skripte, Markdown und R-Markdown) konvertieren. Und umgekehrt. Es bietet auch die Möglichkeit zu paaren ein Notebook zu einem dieser Formate, und automatisch die beiden Darstellungen des Notebooks (eine Synchronisation
.ipynb
und eine.md/.py/.R
Datei).Lassen Sie mich erklären, wie Jupytext die obigen Fragen beantwortet:
Die
.md/.py/.R
Datei enthält nur die Eingabezellen. Sie sollten diese Datei immer verfolgen. Versionieren Sie die.ipynb
Datei nur, wenn Sie die Ausgaben verfolgen möchten.Hinzufügen
*.ipynb
zu.gitignore
Die Ausgaben bleiben in der (lokalen)
.ipynb
Datei erhaltenDer Unterschied in der
.py/.R
oder.md
-Datei ist das, wonach Sie suchenZiehen Sie die neueste Version der Datei
.py/.R
oder.md
und aktualisieren Sie Ihr Notizbuch in Jupyter (Strg + R). Sie erhalten die neuesten Eingabezellen aus der Textdatei mit übereinstimmenden Ausgaben aus der.ipynb
Datei. Der Kernel ist nicht betroffen, was bedeutet, dass Ihre lokalen Variablen erhalten bleiben - Sie können dort weiterarbeiten, wo Sie ihn verlassen haben.Was ich an Jupytext liebe, ist, dass das Notizbuch (in Form einer
.py/.R
oder einer.md
Datei) in Ihrer Lieblings-IDE bearbeitet werden kann. Mit diesem Ansatz wird das Refactoring eines Notebooks einfach. Sobald Sie fertig sind, müssen Sie nur noch das Notizbuch in Jupyter aktualisieren.Wenn Sie es versuchen möchten: Installieren Sie Jupytext mit
pip install jupytext
und starten Sie Ihr Jupyter Notebook oder Ihren Lab-Editor neu. Öffnen Sie das Notizbuch, für das Sie die Versionskontrolle durchführen möchten, und koppeln Sie es mit einer Markdown-Datei (oder einem Skript) über das Jupytext-Menü im Jupyter-Notizbuch (oder die Jupytext-Befehle in Jupyter Lab). Speichern Sie Ihr Notizbuch, und Sie erhalten die beiden Dateien: das Original.ipynb
sowie die versprochene Textdarstellung des Notizbuchs, die sich perfekt für die Versionskontrolle eignet!Für diejenigen, die interessiert sein könnten: Jupytext ist auch in der Kommandozeile verfügbar .
quelle
Ich habe endlich einen produktiven und einfachen Weg gefunden, um Jupyter und Git gut zusammen spielen zu lassen. Ich bin noch in den ersten Schritten, aber ich denke bereits, dass es viel besser ist als alle anderen verschlungenen Lösungen.
Visual Studio Code ist ein cooler und Open Source Code Editor von Microsoft. Es verfügt über eine hervorragende Python-Erweiterung, mit der Sie jetzt ein Jupyter-Notizbuch als Python-Code importieren können . Jetzt können Sie Jupyter-Notizbücher auch direkt bearbeiten .
Nachdem Sie Ihr Notizbuch in eine Python-Datei importiert haben, befinden sich Code und Markdown in einer normalen Python-Datei mit speziellen Markierungen in Kommentaren. Sie können im Bild unten sehen:
Ihre Python-Datei enthält nur den Inhalt der Notebook-Eingabezellen. Die Ausgabe wird in einem geteilten Fenster generiert. Sie haben reinen Code im Notizbuch, der sich nicht ändert, während Sie ihn nur ausführen. Keine vermischte Ausgabe mit Ihrem Code. Kein seltsames JSON-unverständliches Format zur Analyse Ihrer Unterschiede.
Nur reiner Python-Code, mit dem Sie jeden einzelnen Diff leicht identifizieren können.
Ich muss meine
.ipynb
Dateien nicht einmal mehr versionieren. Ich kann eine*.ipynb
Zeile einfügen.gitignore
.Müssen Sie ein Notizbuch erstellen, um es zu veröffentlichen oder mit jemandem zu teilen? Kein Problem, klicken Sie einfach auf die Schaltfläche Exportieren im interaktiven Python-Fenster
Wenn Sie das Notizbuch direkt bearbeiten, wird jetzt ein Symbol angezeigt
Convert and save to a python script
.Hier ein Screenshot eines Notizbuchs in Visual Studio Code:
Ich benutze es erst seit einem Tag, aber endlich kann ich Jupyter gerne mit Git verwenden.
PS: Die Vervollständigung des VSCode-Codes ist viel besser als Jupyter.
quelle
(2017-02)
Strategien
nbstripout
,)nbstripout
,)nbconvert
zu Python: name.ipynb.py (nbconvert
)nbconvert
,ipymd
)Werkzeuge
nbstripout
: Entfernen Sie die Ausgänge von einem Notebookpip install nbstripout; nbstripout install
ipynb_output_filter
: Entfernen Sie die Ausgänge von einem Notebookipymd
: konvertieren zwischen {Jupyter, Markdown, O'Reilly Atlas Markdown, OpenDocument, .py}nbdime
: "Tools zum Differenzieren und Zusammenführen von Jupyter-Notebooks." (2015)nbdiff
: Vergleichen Sie Notebooks terminalfreundlichnbmerge
: Drei-Wege-Zusammenführung von Notebooks mit automatischer Konfliktlösungnbdiff-web
: zeigt Ihnen ein reichhaltiges gerendertes Diff von Notebooksnbmerge-web
: bietet Ihnen ein webbasiertes Drei-Wege-Merge-Tool für Notebooksnbshow
: Präsentieren Sie ein einzelnes Notebook terminalfreundlichquelle
Die sehr beliebten Antworten für 2016 sind inkonsistente Hacks im Vergleich zu dem besseren Weg, dies 2019 zu tun.
Es gibt mehrere Optionen. Die beste Antwort auf die Frage ist Jupytext.
Jupytext
Fangen Sie den Weg zu Daten Wissenschaft Artikel über Jupytext
Die Funktionsweise der Versionskontrolle besteht darin, dass Sie sowohl die .py- als auch die .ipynb-Datei in die Versionskontrolle einfügen. Schauen Sie sich die .py an, wenn Sie den Eingabedifferenz möchten, und schauen Sie sich die .ipynb an, wenn Sie die zuletzt gerenderte Ausgabe möchten.
Bemerkenswerte Erwähnungen: VS Studio, nbconvert, nbdime, Wasserstoff
Ich denke, mit etwas mehr Arbeit werden VS Studio und / oder Wasserstoff (oder ähnliches) die dominierenden Akteure bei der Lösung dieses Workflows sein.
quelle
Stoßen Sie einfach auf "jupytext", der wie eine perfekte Lösung aussieht. Es generiert eine .py-Datei aus dem Notizbuch und hält dann beide synchron. Sie können Eingaben über die .py-Datei versionieren, unterscheiden und zusammenführen, ohne die Ausgaben zu verlieren. Wenn Sie das Notizbuch öffnen, wird die .py für Eingabezellen und die .ipynb für die Ausgabe verwendet. Und wenn Sie die Ausgabe in git aufnehmen möchten, können Sie einfach den ipynb hinzufügen.
https://github.com/mwouts/jupytext
quelle
Da es so viele Strategien und Tools für die Versionskontrolle von Notebooks gibt, habe ich versucht, ein Flussdiagramm zu erstellen, um eine geeignete Strategie auszuwählen (erstellt im April 2019).
quelle
Wie bereits erwähnt,
--script
ist der in veraltet3.x
. Dieser Ansatz kann durch Anwenden eines Post-Save-Hooks verwendet werden. Fügen Sie insbesondere Folgendes hinzuipython_notebook_config.py
:Der Code stammt aus # 8009 .
quelle
.py
ist es leider problematisch, von der Datei auf ein Notizbuch zurückzukehren, sodass dies leider keine vollständige Lösung ist. (Ich wünschte, es wäre so, weil es sehr schön ist,.py
Dateien anstelle von Notizbüchern zu--script
Verhalten unabhängig von der Versionskontrolle zu reproduzieren . Anfangs hatte ich einige Probleme, also für den Fall, dass ich jemandem etwas Zeit sparen kann: 1) Wenn dasipython_notebook_config.py
im Profilordner fehlt, führen Sie es ausipython profile create
, um es zu generieren. 2) Wenn es so aussieht, als würde der Post-Save-Hook ignoriert, führen Sie ipython mit aus,--debug
um das Problem zu diagnostizieren. 3) Wenn das Skript mit einem Fehler fehlschlägtImportError: No module named mistune
- installieren Sie einfach minstue :pip install mistune
.Leider weiß ich nicht viel über Mercurial, aber ich kann Ihnen eine mögliche Lösung geben, die mit Git funktioniert, in der Hoffnung, dass Sie meine Git-Befehle möglicherweise in ihre Mercurial-Entsprechungen übersetzen können.
Im Hintergrund
add
speichert der Befehl in Git die Änderungen, die an einer Datei vorgenommen wurden, in einem Staging-Bereich. Sobald Sie dies getan haben, werden alle nachfolgenden Änderungen an der Datei von Git ignoriert, es sei denn, Sie weisen sie an, sie ebenfalls zu inszenieren. Daher entfernt das folgende Skript, das für jede der angegebenen Dateien das gesamteoutputs
und entferntprompt_number sections
, die entfernte Datei bereitstellt und dann das Original wiederherstellt:HINWEIS: Wenn Sie beim Ausführen eine Fehlermeldung erhalten
ImportError: No module named IPython.nbformat
, verwenden Sieipython
stattdessen das Skriptpython
.Sobald das Skript für die Dateien ausgeführt wurde, deren Änderungen Sie festschreiben wollten, führen Sie es einfach aus
git commit
.quelle
.clean
Erweiterung speichert . Leider konnte ich nicht sehen, wie dies zu tun ist, ohne IPython direkt zu ändern (obwohl diese Änderung ziemlich trivial war). Ich werde eine Weile damit spielen und sehen, ob es all meinen Bedürfnissen entspricht.Ich benutze einen sehr pragmatischen Ansatz; die für mehrere Notebooks an mehreren Seiten gut funktionieren. Und es ermöglicht mir sogar, Notebooks zu "übertragen". Es funktioniert sowohl für Windows als auch für Unix / MacOS.
Al dachte, es ist einfach, ist die oben genannten Probleme zu lösen ...
Konzept
Verfolgen Sie grundsätzlich nicht die
.ipnyb
-Dateien, sondern nur die entsprechenden.py
-Dateien.Wenn Sie den Notebook-Server mit der
--script
Option starten , wird diese Datei automatisch erstellt / gespeichert, wenn das Notebook gespeichert wird.Diese
.py
Dateien enthalten alle Eingaben. Nicht-Code wird in Kommentaren gespeichert, ebenso wie die Zellränder. Diese Dateien können gelesen / importiert (und in den Notebook-Server gezogen) werden, um ein Notebook (neu) zu erstellen. Nur die Ausgabe ist weg; bis es erneut ausgeführt wird.Persönlich verwende ich mercurial , um die
.py
Dateien in der Version zu verfolgen . und verwenden Sie die normalen (Befehlszeilen-) Befehle, um dies hinzuzufügen und einzuchecken (ect). Die meisten anderen (D) VCS erlauben dies.Es ist einfach, die Geschichte jetzt zu verfolgen; Die
.py
sind klein, textuell und einfach zu unterscheiden. Hin und wieder benötigen wir einen Klon (einfach verzweigen; dort einen zweiten Notebook-Server starten) oder eine ältere Version (auschecken und in einen Notebook-Server importieren) usw.Tipps
--script
Option) und führen Sie eine Versionsverfolgung durch.py
Datei zwar gespeichert, aber nicht eingecheckt .Wünscht sich
file@date+rev.py
sollte hilfreich sein. Es wäre zu viel Arbeit, dies hinzuzufügen. und vielleicht werde ich es einmal tun. Bis jetzt mache ich das einfach von Hand.quelle
.py
Datei zurück zu einem Notizbuch? Ich mag diesen Ansatz, aber weil.ipynb
->.py
->.ipynb
potenziell verlustbehaftet ist, habe ich dies nicht ernsthaft in Betracht gezogen..py
zu.ipynb
Formaten vollständig zu erhalten . Hier gibt es ein Problem - vielleicht bildet dies die Grundlage für eine vollständige Lösung..py
Dateien in.ipynb
Dateien.nbconvert
scheint dies noch nicht zu unterstützen, und ich habe kein Notebook-Dashboard, da ich esipython notebook
manuell ausführe . Haben Sie allgemeine Vorschläge zur Implementierung dieser Rückwärtskonvertierung?.py
Umwandlung in ein Notebook nicht für einen Roundtrip gedacht. Das kann also keine allgemeine Lösung sein, obwohl es schön ist, dass es für Sie funktioniert.Um das hervorragende Skript von Pietro Battiston weiterzuverfolgen, wenn Sie einen Unicode-Analysefehler wie diesen erhalten:
Sie können am Anfang des Skripts hinzufügen:
quelle
Ich habe ein Python-Paket erstellt, das dieses Problem löst
https://github.com/brookisme/gitnb
Es bietet eine CLI mit einer von Git inspirierten Syntax zum Verfolgen / Aktualisieren / Diff von Notebooks in Ihrem Git-Repo.
Hier ist ein Beispiel
Beachten Sie, dass der letzte Schritt, in dem ich "gitnb commit" verwende, das Festschreiben für Ihr Git-Repo ist. Es ist im Wesentlichen ein Wrapper für
Es gibt mehrere weitere Methoden, die so konfiguriert werden können, dass in jeder Phase mehr oder weniger Benutzereingaben erforderlich sind. Dies ist jedoch die allgemeine Idee.
quelle
Nachdem ich mich umgesehen hatte, fand ich endlich diesen relativ einfachen Pre-Save-Hook in den Jupyter-Dokumenten . Die Zellenausgabedaten werden entfernt. Sie müssen es in die
jupyter_notebook_config.py
Datei einfügen (Anweisungen siehe unten).Aus der Antwort von Rich Signell :
quelle
Ich habe getan, was Albert & Rich getan hat - Versions-IPynb-Dateien nicht versionieren (da diese Bilder enthalten können, was unordentlich wird). Führen Sie stattdessen entweder immer Ihre Konfigurationsdatei aus
ipython notebook --script
oderc.FileNotebookManager.save_script = True
fügen.py
Sie sie ein, sodass beim Speichern Ihres Notebooks immer eine (versionierbare) Datei erstellt wird.Um Notizbücher neu zu generieren (nachdem ich ein Repo ausgecheckt oder einen Zweig gewechselt habe ), lege ich das Skript py_file_to_notebooks.py in das Verzeichnis, in dem ich meine Notizbücher speichere.
Nachdem Sie ein Repo
python py_file_to_notebooks.py
ausgecheckt haben , führen Sie es einfach aus , um die ipynb-Dateien zu generieren. Nach dem Wechsel der Verzweigung müssen Sie möglicherweise ausführenpython py_file_to_notebooks.py -ov
, um die vorhandenen ipynb-Dateien zu überschreiben.Um auf der sicheren Seite zu sein, ist es gut, auch
*.ipynb
zu Ihrer.gitignore
Datei hinzuzufügen .Bearbeiten: Ich mache das nicht mehr, weil (A) Sie Ihre Notizbücher jedes Mal aus Py-Dateien neu generieren müssen, wenn Sie einen Zweig auschecken, und (B) Sie andere Dinge wie Abschriften in Notizbüchern verlieren. Ich entferne stattdessen die Ausgabe von Notebooks mit einem Git-Filter. Eine Diskussion darüber finden Sie hier .
quelle
.py
Dateien zurück in.ipynb
problematisch ist, insbesondere bei Notebooks der Version 4, für die es noch keinen Konverter gibt. Derzeit müsste man den v3-Importer verwenden und dann auf v4 konvertieren, und ich bin etwas besorgt über diese komplizierte Reise. Auch eine.py
Datei ist keine sehr gute Wahl, wenn das Notebook hauptsächlich Julia-Code ist! Schließlich--script
ist veraltet, so dass ich denke, Haken sind der richtige Weg.Ok, es sieht so aus, als ob die derzeit beste Lösung laut einer Diskussion hier darin besteht, einen Git-Filter zu erstellen, um die Ausgabe von ipynb-Dateien beim Festschreiben automatisch zu entfernen.
Folgendes habe ich getan, um es zum Laufen zu bringen (kopiert aus dieser Diskussion):
Ich verändert nbstripout Datei cfriedline leicht einem informativen Fehler zu geben , wenn Sie nicht die neueste IPython importieren: https://github.com/petered/plato/blob/fb2f4e252f50c79768920d0e47b870a8d799e92b/notebooks/config/strip_notebook_output Und es zu meiner Repo, lasse sag rein
./relative/path/to/strip_notebook_output
Außerdem wurde die Datei .gitattributes zum Stammverzeichnis des Repos hinzugefügt, die Folgendes enthält:
Und ein
setup_git_filters.sh
Containing erstelltUnd rannte
source setup_git_filters.sh
. Das schicke $ (git rev-parse ...) ist, den lokalen Pfad Ihres Repos auf jedem (Unix-) Computer zu finden.quelle
Mit dieser jupyter-Erweiterung können Benutzer jupyter-Notebooks direkt an github senden.
Bitte schauen Sie hier
https://github.com/sat28/githubcommit
quelle
Dies ist April-2020 und es gibt viele Strategien und Tools für die Versionskontrolle von Jupyter-Notebooks. Hier ist ein kurzer Überblick über alle Tools, die Sie verwenden können:
nbdime - Nizza für das lokale Diff'ing und Zusammenführen von Notebooks
nbstripout - Ein Git-Filter zum automatischen Entfernen von Notebook-Ausgaben vor jedem Commit
jupytext - Hält eine .py-Begleitdatei mit jedem Notizbuch synchronisiert. Sie schreiben nur .py-Dateien fest
nbconvert - Konvertiert Notizbücher in ein Python-Skript oder HTML (oder beides) und schreibt diese alternativen Dateitypen fest
ReviewNB - Zeigt den Notebook- Unterschied (zusammen mit der Ausgabe) für alle Commit- oder Pull-Anforderungen auf GitHub an. Man kann auch Kommentare zu Notizbuchzellen schreiben, um Änderungen zu besprechen (Screenshot unten).
Haftungsausschluss: Ich habe ReviewNB erstellt.
quelle
Wie wäre es mit der Idee, die im folgenden Beitrag besprochen wurde, in der die Ausgabe des Notebooks aufbewahrt werden soll, mit dem Argument, dass das Generieren möglicherweise lange dauert, und es ist praktisch, da GitHub jetzt Notebooks rendern kann. Es wurden automatisch gespeicherte Hooks zum Exportieren von .py-Dateien hinzugefügt, die für Unterschiede und .html zum Teilen mit Teammitgliedern verwendet werden, die keine Notebooks oder Git verwenden.
https://towardsdatascience.com/version-control-for-jupyter-notebook-3e6cef13392d
quelle