406 Stimmen

Wie konvertiere ich ein IPython Notebook über die Befehlszeile in eine Python-Datei?

Ich erwäge, die *.ipynb -Dateien als Quelle der Wahrheit zu verwenden und sie programmgesteuert in .py-Dateien für geplante Jobs/Aufgaben zu 'kompilieren'.

Der einzige Weg, den ich kenne, um das zu tun, ist über die GUI. Gibt es einen Weg, es über die Befehlszeile zu tun?

0voto

Jeremy Punkte 849

Ich habe eine Funktion erstellt, um dies zu erreichen. Der Benutzer muss nichts installieren, um sie zu verwenden.

#!/usr/bin/python

# Eine kurze Routine zum Konvertieren eines Jupyter Notebooks in eine Python-Datei

import json

def ipynb_to_py(input_ipynb_file,output_py_file=None):
    """
    Generiert ein Python-Skript (.py), das den gesamten Quellcode aus dem Eingabebuch Jupyter Notebook (.ipynb) enthält.

    Der Benutzer kann eine Jupyter Notebook-Datei aus dem aktuellen Arbeitsverzeichnis oder einem Pfad eingeben.

    Wenn der Name für die Ausgabedatei nicht angegeben ist,
    wird der Dateiname der Eingabebuch-Jupyter-Notebookdatei kopiert, jedoch wird die Dateierweiterung von ".ipynb" in ".py" geändert.
    Und die Ausgabedatei wird im selben Verzeichnis wie das Eingabebuch-Jupyter-Notebook gespeichert.
    Zum Beispiel:
    ipynb_to_py("test-jupyternotebook.ipynb")
    ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb")

    Der Benutzer kann auch einen Ausgabedateinamen angeben, der mit ".py" endet.
    Wenn der Ausgabedateiname bereitgestellt wird, jedoch kein Pfad zur Ausgabedatei hinzugefügt wird,
    wird die Datei im aktuellen Arbeitsverzeichnis gespeichert.
    Zum Beispiel:
    ipynb_to_py("test-jupyternotebook.ipynb","test1.py")
    ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb","test2.py")

    Der Benutzer kann die Datei in einem Zielverzeichnis speichern, indem er einen Pfad zur Ausgabedatei hinzufügt.
    Zum Beispiel:
    ipynb_to_py("test-jupyternotebook.ipynb","./test-outputdir/test3.py")
    ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb","./test-output-dir/test4.py")

    Diese Funktion bearbeitet oder löscht die Original-Jupyter-Notebookdatei nicht.

    Args:
    -----
        input_ipynb_file: Der Dateiname-String für das Jupyter Notebook (endet mit ".ipynb")
        output_py_file (optional): Der Dateiname für die zu erstellende Python-Datei (endet mit ".py"). 

    Returns:
    --------
        Eine Python-Datei, die den gesamten Quellcode im Jupyter-Notebook enthält.

    Beispiele:
    ---------------
        ipynb_to_py("test-jupyternotebook.ipynb")
        ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb")
        ipynb_to_py("test-jupyternotebook.ipynb","test1.py")
        ipynb_to_py("test-jupyternotebook.ipynb","./test-outputdir/test2.py")
        ipynb_to_py("test-jupyternotebook.ipynb","./test-outputdir/test3.py")
        ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb","./test-output-dir/test4.py")

    """
    # Überprüfe, ob die Eingabedatei ein Jupyter-Notebook ist
    if input_ipynb_file.endswith(".ipynb"):

        # Öffne die Eingabedatei des Jupyter-Notebooks
        notebook = open(input_ipynb_file)

        # Lese den Inhalt in json-Format
        notebook_content = json.load(notebook)

        # Extrahiere nur den Quellcode-Schnipsel aus jeder Zelle im Eingabebuch-Jupyter-Notebook
        source_code_snippets = [cell['source'] for cell in notebook_content['cells']]

        # Wenn der Name für die Ausgabedatei nicht angegeben ist,
        # Der Name des Eingabebuch-Jupyter-Notebooks wird verwendet, nachdem ".ipynb" in ".py" geändert wurde.
        if output_py_file == None:
            output_py_file = input_ipynb_file.split('.ipynb')[0]+".py"
        else:
            pass

        # Erstelle ein Python-Skript, um alle extrahierten Quellcode-Schnipsel zu speichern
        output_file = open(output_py_file,'w')

        # Gib jede Zeile in jedem Quellcode-Schnipsel in die Ausgabedatei aus
        for snippet in source_code_snippets:
            for line in snippet:
                # Verwende end='', um unerwünschte Lücken zwischen den Zeilen zu vermeiden
                print(line,end = '',file = output_file)
            # Am Ende jedes Schnipsels, gehe zur nächsten Zeile, bevor der nächste gedruckt wird
            print('',sep = '\n',file=output_file)

        # Schließe die Ausgabedatei
        output_file.close()
        print("Der Pfad zur Ausgabedatei:",output_py_file)

    else:
        print("Die Eingabedatei muss ein Jupyter-Notebook (im .ipynb-Format) sein!")

def main():
    pass

if __name__ == "__main__":
    main()

0voto

jupyter nbconvert main.ipynb --to python

-1voto

Jiren Jin Punkte 377

Ich hatte dieses Problem und versuchte, online nach der Lösung zu suchen. Obwohl ich einige Lösungen gefunden habe, haben sie immer noch einige Probleme, z.B. die lästige Untitled.txt Automatik-Erstellung, wenn Sie ein neues Notebook vom Dashboard aus starten.

Also habe ich schließlich meine eigene Lösung geschrieben:

import io
import os
import re
from nbconvert.exporters.script import ScriptExporter
from notebook.utils import to_api_path

def script_post_save(model, os_path, contents_manager, **kwargs):
    """Speichern Sie eine Kopie des Notebooks im entsprechenden Quellcode-Skript.

    Wenn Sie z. B. eine `foo.ipynb` Datei speichern, wird im gleichen Verzeichnis auch ein entsprechendes `foo.py` Python-Skript gespeichert.

    Die vorhandenen Konfigurationsdateien, die ich online gefunden habe (einschließlich derjenigen im offiziellen Handbuch), erstellen jedoch auch eine `Untitile.txt` Datei, wenn Sie ein neues Notebook erstellen, auch wenn Sie die "Speichern"-Schaltfläche nicht gedrückt haben. Dies ist lästig, da wir das Notebook später in der Regel mit einem aussagekräftigeren Namen umbenennen und jetzt die generierte Skriptdatei auch umbenennen müssen!

    Daher machen wir hier eine Änderung, um die neu erstellten Notebooks herauszufiltern, indem wir ihre Namen überprüfen. Für ein Notebook, dem kein Name gegeben wurde, d. h. dessen Name `Untitled.*` lautet, wird das entsprechende Quellcode-Skript nicht gespeichert. Beachten Sie, dass dieses Verhalten auch gilt, wenn Sie manuell ein "Untitled" Notebook speichern. Die Begründung ist, dass wir in der Regel keine Skripte mit den nutzlosen "Untitled" Namen speichern möchten.
    """
    # nur für Notebooks verarbeiten
    if model["type"] != "notebook":
        return

    script_exporter = ScriptExporter(parent=contents_manager)
    base, __ = os.path.splitext(os_path)

    # nichts tun, wenn der Notebook-Name mit `Untitled[0-9]*` endet
    regex = re.compile(r"Untitled[0-9]*$")
    if regex.search(base):
        return

    script, resources = script_exporter.from_filename(os_path)
    script_fname = base + resources.get('output_extension', '.txt')

    log = contents_manager.log
    log.info("Skript speichern unter /%s",
             to_api_path(script_fname, contents_manager.root_dir))

    with io.open(script_fname, "w", encoding="utf-8") as f:
        f.write(script)

c.FileContentsManager.post_save_hook = script_post_save

Um dieses Skript zu verwenden, können Sie es zu ~/.jupyter/jupyter_notebook_config.py hinzufügen :)

Beachten Sie, dass Sie möglicherweise den Jupyter Notebook / Lab neu starten müssen, damit es funktioniert.

-2voto

Das %notebook foo.ipynb Magic-Kommando exportiert das aktuelle IPython nach "foo.ipynb".

Mehr Informationen durch Eingabe von %notebook?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X