Ausführen eines IPython / Jupyter-Notebooks nicht interaktiv

79

Weiß jemand, ob es möglich ist, ein IPython / Jupyter-Notebook nicht interaktiv über die Befehlszeile .ipynbauszuführen und die resultierende Datei mit den Ergebnissen des Laufs zu speichern? Wenn es noch nicht möglich ist, wie schwierig wäre es, mit phantomJS zu implementieren, den Kernel ein- und auszuschalten und den Webserver ein- und auszuschalten?

Nehmen wir genauer an, ich habe bereits ein Notizbuch original.ipynbund möchte alle Zellen in diesem Notizbuch erneut ausführen und die Ergebnisse in einem neuen Notizbuch speichern. Führen new.ipynbSie dies jedoch mit einem einzigen Befehl in der Befehlszeile aus, ohne dass eine Interaktion im Browser oder erforderlich ist um den Kernel oder Webserver zu schließen und davon auszugehen, dass noch kein Kernel oder Webserver ausgeführt wird.

Beispielbefehl:

$ ipython notebook run original.ipynb --output=new.ipynb

Davidshinn
quelle

Antworten:

70

Ja, es ist möglich und einfach, es wird (meistens) in IPython Core für 2.0 sein. Ich würde vorschlagen, diese Beispiele vorerst zu betrachten.

[bearbeiten]

$ jupyter nbconvert --to notebook --execute original.ipynb --output=new.ipynb

Es ist jetzt in Jupyter NbConvert. NbConvert enthält eine Reihe von Preprocessors, die standardmäßig deaktiviert sind. Zwei davon ( ClearOutputPreprocessorund ExecutePreprocessor) sind von Interesse. Sie können sie entweder in Ihren (lokalen | globalen) Konfigurationsdateien über c.<PreprocessorName>.enabled=True(Großbuchstaben, die Python sind) oder in der Befehlszeile aktivieren, wobei --ExecutePreprocessor.enabled=Trueder Rest des Befehls wie gewohnt beibehalten wird .

Das --ExecutePreprocessor.enabled=Trueverfügt über einen praktischen --executeAlias, der in der neuesten Version von NbConvert verwendet werden kann. Es kann auf Wunsch mit kombiniert --inplacewerden

Konvertieren Sie beispielsweise nach dem Ausführen des Notebooks ohne Kopf in HTML:

$ jupyter nbconvert --to=html --execute RunMe.ipynb

Konvertieren in PDF nach dem Entfernen von Ausgaben

$ ipython nbconvert --to=pdf --ClearOutputPreprocessor.enabled=True RunMe.ipynb

Dies funktioniert (natürlich) mit Nicht-Python-Kerneln, indem ein <insert-your-language-here>Kernel erzeugt wird, wenn Sie dies festlegen --profile=<your fav profile>. Die Konvertierung kann sehr lange dauern, bis das Notebook erneut ausgeführt werden muss. Mit dieser --to=notebookOption können Sie die Konvertierung von Notebook zu Notebook durchführen .

Es gibt verschiedene andere Optionen (Zeitüberschreitung, Fehler zulassen, ...), die je nach Anwendungsfall möglicherweise gesetzt / deaktiviert werden müssen. Siehe Dokumentation und natürlich jupyter nbconvert --help, --help-alloder nbconvert Online - Dokumentation für weitere Informationen.

Matt
quelle
1
Danke, dass Sie mich in die richtige Richtung weisen. Da der genaue Code nicht veröffentlicht wurde, habe ich einen der Kernel gegabelt und den Ausgabecode hinzugefügt, damit im Folgenden ein Notizbuch über die Befehlszeile ausgeführt wird, genau wie bei einem gewünschten $ ipnbdocttest.py original.ipynb new.ipynb gist.github.com/davidshinn/6110231
davidshinn
3
Nein, nicht in IPython 2, auf dem Weg zu IPython 3
Matt
7
Es scheint, dass dies jetzt ist (Ipython 3.1.0): ipython nbconvert --to=html --execute RunMe.ipynb
Patricksurry
5
@ NoahR Versuchen Sie --ExecutePreprocessor.timeout=-1 ref
Lenna
5
Der neueste Jupiter (4.1.0) erlaubt es tatsächlich, Notebooks nicht interaktiv auszuführen, jupyter nbconvert --to notebook --execute --allow-errors notebook.ipynbvielleicht könnte die Antwort bearbeitet werden
mgalardini
20

Bis diese Funktionalität Teil des Kerns wird, habe ich eine kleine Befehlszeilen-App zusammengestellt, die genau das tut, was Sie wollen. Es heißt runipy und Sie können es mit installieren pip install runipy. Die Quelle und die Readme-Datei befinden sich auf Github .

paul
quelle
runipy scheint für mich nicht so gut zu funktionieren: Es aktualisiert das signatureFeld nicht und infolgedessen (nun, ich denke, es ist eine Konsequenz) wird keines meiner SVGs tatsächlich gerendert: IPython zieht es vor, __repr__stattdessen das reine Text-Rendering anzuzeigen .
Akim
1

Führen Sie die ursprüngliche .ipunb-Datei aus und ersetzen Sie sie:

jupyter nbconvert --ExecutePreprocessor.timeout=-1 --to notebook --inplace --execute original.ipynb
Manualmsdos
quelle
1

Um einige Funktionen wie Parallel Worker, Eingabeparameter, E-Mail-Versand oder S3-Eingabe / Ausgabe abzudecken, können Sie jupyter-running installieren

pip install jupyter-runner

Readme auf Github: https://github.com/omar-masmoudi/jupyter-runner

Omar
quelle
-5

Sie können den iPython-Notebook-Server einfach über die Befehlszeile ausführen:

ipython notebook --pylab inline

Dadurch wird der Server im nicht interaktiven Modus gestartet und die gesamte Ausgabe wird unter dem Code gedruckt. Sie können dann die .ipynb-Datei speichern, die Code & Output enthält.

ala
quelle
Vielen Dank für die Antwort, aber ich suchte nach einer spezifischeren Lösung, die weder einen Eingriff in den Webbrowser noch das Schließen des Kernels und des Webservers erforderte. Ich habe die Frage genauer bearbeitet.
Davidshinn
In diesem Fall weiß ich nicht, wie ich vorgehen soll. Planen Sie dies regelmäßig? Das iPython-Notebook ist so konzipiert, dass es interaktiv in einem Browser verwendet werden kann, und das Speichern bestimmter ipynb-Dateien über die Befehlszeile erscheint mir ziemlich seltsam.
ala
Ja, ich habe vor, dies sehr oft zu tun, wenn es verfügbar wäre. Es wäre sehr nützlich in Fällen, in denen sich Datenquellen häufig ändern und ich eine Diagnoseausgabe von Pandas sehen möchte, die mit dem von ihm erzeugten Code verschachtelt sind, genau das, was ipython notebook sehr gut kann. Wenn ich jedoch viele dieser Prozesstypen pro Tag ausführen muss, ist es besser, wenn sie im Batch ausgeführt werden und ich die Ausgabe später betrachten kann, als ob Protokolldateien erstellt würden. Das Problem bei der Standardprotokollierung besteht darin, dass der Code und die Ausgabe nur schwer miteinander verschachtelt sind.
Davidshinn
4
Dies scheint mir ein erstaunlich nützlicher Anwendungsfall zu sein. Sie können ein Vorlagen-Notizbuch nehmen, es ein wenig parametrisieren und dann eine druckbare, vollständig ausgeführte Lösung erhalten, ohne einen Browser zu berühren.
Holdenweb