wake-up-neo.com

Wiederverwenden von Code von verschiedenen IPython-Notebooks

Ich verwende IPython und möchte Funktionen von einem Notebook aus einem anderen ausführen (ohne sie zwischen verschiedenen Notebooks auszuschneiden und einzufügen). Ist das möglich und ziemlich einfach?

42
user7289

Sie können mit einem qtconsole eine Verbindung zum selben Kernel herstellen. Einfach beim Start angeben:

ipython qtconsole --existing kernel-0300435c-3d07-4bb6-abda-8952e663ddb7.json

Sehen Sie sich die Ausgabe an, nachdem Sie das Notebook nach der langen Zeichenfolge gestartet haben.

4
Mike Müller

Starten Sie Ihren Notebook-Server mit:

ipython notebook --script

speichert die Notizbücher (.ipynb) ebenfalls als Python-Skripts (.py), und Sie können sie importieren.

Oder werfen Sie einen Blick auf: http://nbviewer.ipython.org/5491090/ , das 2 Notizbücher enthält, von denen eines das andere ausführt.

34
Matt

In IPython 2.0 können Sie einfach %run 'my_shared_code.ipynb' verwenden, um Code zwischen Notebooks zu teilen. Siehe zum Beispiel http://nbviewer.ipython.org/Gist/edrex/9044756 .

19
Eric Drechsel

Mit Ipythons %run magic können Sie Python-Dateien und ipython-Skripts in einem Notizbuch ausführen. Manchmal verwende ich die -i-Option, damit sie im Namespace der Notebooks ausgeführt wird. Führen Sie eine Zelle mit %run? aus, um weitere Informationen zu erhalten.

Sie können den ipython --script verwenden, um Notebooks auch als .py-Dateien auf jeder Datei zu speichern oder die Zeile c.NotebookManager.save_script=True in Ihrer ipython_notebook_config.py-Datei zu kommentieren, um denselben Effekt zu erzielen (verwenden Sie ipython profile create, um auf Ubuntu die Konfigurationsdateien in ~/.config/ipython/ einzurichten).

Edit: Folgendes ist wahr, aber nicht notwendig - Sie können %run eine .ipynb-Datei direkt eingeben. Danke Eric .

Wenn Sie in dem Notebook, das Sie importieren möchten, ipython magics verwenden, habe ich festgestellt, dass Sie die .py-Datei in .ipy (ein ipython-Skript) umbenennen können, aber ich musste die erste Zeile (die die Dateikodierungsdeklaration enthielt) entfernen, damit sie funktioniert . Es gibt wahrscheinlich einen besseren Weg! Dieser Ansatz wird wahrscheinlich auch die Zellmagie verwirren (sie würden alle gleichzeitig angewendet).

13
drevicko

Es gibt auch eine Erweiterung zum Schreiben und Ausführen, mit der Sie den Inhalt einer Zelle in eine Datei schreiben können (und alten Inhalt ersetzen -> Aktualisierungscode), die dann in ein anderes Notizbuch importiert werden kann.

https://github.com/minrk/ipython_extensions#write-and-execute

In einem Notizbuch (zwei Zellen)

%reload_ext writeandexecute
--
%%writeandexecute -i some_unique_string functions.py
def do_something(txt):
    print(txt)

Und dann im anderen Notizbuch:

from functions import do_something
do_something("hello world")
4
Jan Katins

Ja, Sie können "Funktionen von einem Notebook aus auf ein anderes ausführen (ohne sie zwischen verschiedenen Notebooks auszuschneiden und einzufügen)" - und, ja, das ist einfach! 

tl; dr: füge den Code in Python-Dateien (*.py) im Dateisystem ein und lass mehrere Notebooks denselben Code verwenden. (So ​​einfach ist das.)

(Warum so viel Code in Notebooks stecken, wenn wir über perfekte Code-Editoren und IDEs verfügen, die viel besser zum Schreiben und Lesen von Code sind? Ganz zu schweigen von der Notwendigkeit einer korrekten Versionskontrolle! Was wollen wir erreichen? welche Ausgaben? </rant>)

Einzelheiten:

  • Fügen Sie Ihren Code in normale Python-Dateien ein, z. B. my_code/foo.py, und fügen Sie einen (wahrscheinlich leeren) my_code/__init__.py ein.
  • Nutzen Sie den Code unter der richtigen Versionskontrolle (z. B. git). Beachten Sie, wie schwierig es war, ipynb json-Dateien zu unterscheiden.
  • Stellen Sie die Notebooks auch unter Versionskontrolle. Rohe Git-Protokolle werden schwer zu lesen sein, aber die Kommentare können nützlich sein. (GitHub/GitLab zeigt ipython-Notizbücher, übrigens.)
  • Beschränken Sie die py-Quelle im ipynb-Notebook auf kleine Mengen von Treibercode sowie Ausgabe und Dokumentation.
  • Wenn Sie die externen Python-Dateien "integrieren" möchten, verwenden Sie einfach z. B. magic %cat my_code/foo.py ...

... Wenn Sie möchten, dass diese Quelle Inline eingeblendet wird (optional, indem Sie einer externen, wiederverwendbaren Quelldatei Folgendes hinzufügen) ...

import IPython
from pygments import highlight
from pygments.formatters import HtmlFormatter
from pygments.lexers import get_lexer_for_filename

filename='my_code/foo.py'
with open(filename) as f: code = f.read()
formatter = HtmlFormatter(linenos='inline')
IPython.display.HTML('<style type="text/css">{}</style>{}'.format(
                formatter.get_style_defs('.highlight'),
                highlight(code, get_lexer_for_filename(filename), formatter)))

Ihre bevorzugten Code-Editoren und IDEs bedanken sich für Ihre Unterstützung.

2
michael

Ich verwende im Notebook die folgende Funktion, von der ich Funktionen oder Aktionen aus einem Quellnotizbuch laden möchte:

import io
import nbformat

def execute_notebook(nbfile):
    with io.open(nbfile, encoding="utf8") as f:
        nb = nbformat.read(f, as_version=4)

    ip = get_ipython()

    for cell in nb.cells:
        if cell.cell_type != 'code':
            continue
        ip.run_cell(cell.source)

Verwenden Sie wie:

execute_notebook(path/to/notebook.ipynb)
1
Mattijn

Ich rufe Notebooks von anderen Notebooks an. Sie können sogar "Parameter" mit dem folgenden Trick an andere Notebooks übergeben:

Platzieren Sieparamsdictionary in der ersten Zelle von "report_template.ipynb".

params = dict(platform='iOS', 
              start_date='2016-05-01', 
              retention=7)
df = get_data(params ..)
do_analysis(params ..)

Und in einem anderen Notebook (mit höherer logischer Ebene) führen Sie es mit dieser Funktion aus:

def run_notebook(nbfile, **kwargs):
    """
    example:
    run_notebook('report.ipynb', platform='google_play', start_date='2016-06-10')
    """

    def read_notebook(nbfile):
        if not nbfile.endswith('.ipynb'):
            nbfile += '.ipynb'

        with io.open(nbfile) as f:
            nb = nbformat.read(f, as_version=4)
        return nb

    ip = get_ipython()
    gl = ip.ns_table['user_global']
    gl['params'] = None
    arguments_in_original_state = True

    for cell in read_notebook(nbfile).cells:
        if cell.cell_type != 'code':
            continue
        ip.run_cell(cell.source)

        if arguments_in_original_state and type(gl['params']) == dict:
            gl['params'].update(kwargs)
            arguments_in_original_state = False

run_notebook("report_template.ipynb", start_date='2016-09-01')

Dieser Befehl führt jede Zelle des Notizbuchs "report_template" aus und überschreibt relevante Schlüssel vonparamsdictionary ab der zweiten Zelle

1
volodymyr

Die gute Idee von @ MikeMuller funktioniert also für ein lokales Notebook, nicht jedoch für ein entferntes (richtig?). Ich glaube nicht, dass es eine Möglichkeit für Sie gibt, einzelne Zellenblöcke oder Funktionen von ipynb-Code auf einem Remote-Server aus der Ferne aufzurufen und Ergebnisse programmgesteuert wieder in Ihre Aufrufroutine zu bringen, es sei denn, dieser Code bewirkt etwas außerordentliches, um Ergebnisse zu kommunizieren. 

Ich war gerade dabei zu schreiben, als @Matt dieselbe Idee übermittelte 

ipython <URI_to_Notebook> --script

Das * .pynb ist ein JSON-Container und kein eigentliches Python-Skript. Sie können mit ipython ein * .py mit exportieren 

Wenn sich das Ziel * .ipynb auf einem Remote-Computer befindet, den Sie nicht steuern können, müssen Sie die Datei wahrscheinlich ziehen, damit Sie die Ausgabe in einen lokalen Pfad schreiben können. (Es wurde nicht untersucht, ob Sie diese Funktion in einer Remote-Ressource aufrufen können, um eine lokale Ausgabe zu erstellen.) Sobald diese erstellt wurde, sollten Sie die * .py-Funktion oder einzelne Funktionen darin importieren und ausführen können.

Eine Frage für @Matt an diesem netten Beispiel für das Ausführen einer anderen * .ipynb-Datei mit io.open(nbfile) ist, ob die nbfile-Datei entfernt sein kann. Scheint wie ein Weitschuss, wäre aber großartig ...

0
Roland

Hier sind zwei zusätzliche Tipps:

  1. Sie können %qtconsole magic auch direkt vom Notebook aus ausführen, und es wird automatisch eine Verbindung zum Notebook-Kernel hergestellt.

  2. Check out https://github.com/atiasnir/ipnb

    Sie können damit Notebook-Dateien importieren, als wären sie Standard-Python-Module (ich bin der Autor :-)). Die Haupteinschränkung hier ist, dass magische Zellen verworfen werden (weil IPython überhaupt nicht verwendet wird), aber ansonsten sollte es gut funktionieren.

0
atiasnir