Hoe converteer ik een IPython Notebook naar een Python-bestand via de commandoregel?

Ik ben aan het kijken naar het gebruik van de *.ipynb-bestanden als de bron van waarheid en ze programmatisch te ‘compileren’ in .py-bestanden voor geplande taken/taken.

De enige manier die ik begrijp om dit te doen, is via de GUI. Is er een manier om dit via de opdrachtregel te doen?


Antwoord 1, autoriteit 100%

Als u niet elke keer dat u opslaat een Python-script wilt uitvoeren, of als u de IPython-kernel niet opnieuw wilt opstarten:

Op de opdrachtregelkunt u nbconvert:

$ jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb

Als een beetje een hack, je kunt zelfs het bovenstaande commando ineen IPython-notebookoproepen door !(gebruikt voor elk commandoregelargument). In een notitieboekje:

!jupyter nbconvert --to script config_template.ipynb

Voordat --to scripttoegevoegdwerd optie was --to pythonof --to=python, maar het was hernoemdin de richting van een taalonafhankelijk notebooksysteem.


Antwoord 2, autoriteit 22%

Als u alle *.ipynb-bestanden van de huidige map naar het python-script wilt converteren, kunt u de opdracht als volgt uitvoeren:

jupyter nbconvert --to script *.ipynb

Antwoord 3, autoriteit 4%

Hier is een snelle en vuile manier om de code uit V3 of V4 Ipynb te extraheren zonder IPYTHON te gebruiken. Het controleert geen celtypen, enz.

import sys,json
f = open(sys.argv[1], 'r') #input.ipynb
j = json.load(f)
of = open(sys.argv[2], 'w') #output.py
if j["nbformat"] >=4:
        for i,cell in enumerate(j["cells"]):
                of.write("#cell "+str(i)+"\n")
                for line in cell["source"]:
                        of.write(line)
                of.write('\n\n')
else:
        for i,cell in enumerate(j["worksheets"][0]["cells"]):
                of.write("#cell "+str(i)+"\n")
                for line in cell["input"]:
                        of.write(line)
                of.write('\n\n')
of.close()

Antwoord 4, Autoriteit 4%

Het vorige voorbeeld volgen, maar met de Nieuwe NBFFormat Lib-versie :

import nbformat
from nbconvert import PythonExporter
def convertNotebook(notebookPath, modulePath):
  with open(notebookPath) as fh:
    nb = nbformat.reads(fh.read(), nbformat.NO_CONVERT)
  exporter = PythonExporter()
  source, meta = exporter.from_notebook_node(nb)
  with open(modulePath, 'w+') as fh:
    fh.writelines(source.encode('utf-8'))

Antwoord 5, Autoriteit 3%

Jupytext is leuk om te hebben in uw toolchain voor dergelijke conversies. Het maakt niet alleen conversie van een notebook naar een script, maar u kunt ook weer teruggaan van het script naar notebook. En hebben zelfs dat notebook geproduceerd in uitgevoerd formulier.

jupytext --to py notebook.ipynb                 # convert notebook.ipynb to a .py file
jupytext --to notebook notebook.py              # convert notebook.py to an .ipynb file with no outputs
jupytext --to notebook --execute notebook.py    # convert notebook.py to an .ipynb file and run it 

Antwoord 6

U kunt dit doen vanuit de IPython API.

from IPython.nbformat import current as nbformat
from IPython.nbconvert import PythonExporter
filepath = 'path/to/my_notebook.ipynb'
export_path = 'path/to/my_notebook.py'
with open(filepath) as fh:
    nb = nbformat.reads_json(fh.read())
exporter = PythonExporter()
# source is a tuple of python source code
# meta contains metadata
source, meta = exporter.from_notebook_node(nb)
with open(export_path, 'w+') as fh:
    fh.writelines(source)

Antwoord 7

Voor het recursief converteren van alle *.ipynb-bestanden in de huidige map naar python-scripts:

for i in *.ipynb **/*.ipynb; do 
    echo "$i"
    jupyter nbconvert  "$i" "$i"
done

Antwoord 8

Ik begrijp dat dit een oude thread is. Ik heb hetzelfde probleem ondervonden en wilde het .pynb-bestand via de opdrachtregel naar het .py-bestand converteren.

Mijn zoekopdracht bracht me naar ipynb-py-convert

Door onderstaande stappen te volgen kon ik het .py-bestand krijgen

  1. Installeer “pip install ipynb-py-convert”
  2. Ga naar de map waar het ipynb-bestand is opgeslagen via de opdrachtprompt
  3. Voer de opdracht in

> ipynb-py-convert YourFileName.ipynb YourFilename.py

bijvoorbeeld :. IPYNB-PY-Convert Get-Begin-Wit-Kaggle-Titanic-PROBLEEM.IPYNB GET-STARTED-WITH-KAGGLE-TITANIC-PROMEM.PY

Bovenstaande opdracht maakt een Python-script met de naam “YourFilename.py” en volgens ons voorbeeld maakt het getting-started-with-kaggle-titanic-problem.pyBestand


Antwoord 9

In het volgende voorbeeld wordt een Iron Python-notebook genaamd a_notebook.ipynbin een Python-script genaamd a_python_script.pyLaat de cellen die zijn getagd met het trefwoord remove, die ik handmatig aan de cellen toevoegen waarvan ik niet in het script wil eindigen, het verlaten van visualisaties en andere stappen die als ik klaar ben met de notebook, hoeft ik niet door het script te worden uitgevoerd.

import nbformat as nbf
from nbconvert.exporters import PythonExporter
from nbconvert.preprocessors import TagRemovePreprocessor
with open("a_notebook.ipynb", 'r', encoding='utf-8') as f:
    the_notebook_nodes = nbf.read(f, as_version = 4)
trp = TagRemovePreprocessor()
trp.remove_cell_tags = ("remove",)
pexp = PythonExporter()
pexp.register_preprocessor(trp, enabled= True)
the_python_script, meta = pexp.from_notebook_node(the_notebook_nodes)
with open("a_python_script.py", 'w', encoding='utf-8') as f:
    f.writelines(the_python_script)

Antwoord 10

Er is een heel mooi pakket genaamd nb_dev die is ontworpen voor authoring Python-pakketten in JUPYTER-notebooks. Zoals nbconvert,Het kan een notebook in een .py-bestand worden, maar het is flexibeler en krachtiger omdat het veel leuke aanvullende authoring-functies heeft om u te helpen bij het ontwikkelen van tests, documentatie en het registreren van pakketten PYPI. Het is ontwikkeld door de FAST.AI-mensen.

Het heeft een beetje een leercurve, maar de documentatie is goed en het is over het algemeen niet moeilijk.


Antwoord 11

Ik had dit probleem en probeerde de oplossing online te vinden. Hoewel ik een aantal oplossingen heb gevonden, hebben ze nog steeds enkele problemen, bijvoorbeeld de irritante Untitled.txtautomatische creatie wanneer je een nieuwe notebook start vanaf het dashboard.

Dus uiteindelijk schreef ik mijn eigen oplossing:

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):
    """Save a copy of notebook to the corresponding language source script.
    For example, when you save a `foo.ipynb` file, a corresponding `foo.py`
    python script will also be saved in the same directory.
    However, existing config files I found online (including the one written in
    the official documentation), will also create an `Untitile.txt` file when
    you create a new notebook, even if you have not pressed the "save" button.
    This is annoying because we usually will rename the notebook with a more
    meaningful name later, and now we have to rename the generated script file,
    too!
    Therefore we make a change here to filter out the newly created notebooks
    by checking their names. For a notebook which has not been given a name,
    i.e., its name is `Untitled.*`, the corresponding source script will not be
    saved. Note that the behavior also applies even if you manually save an
    "Untitled" notebook. The rationale is that we usually do not want to save
    scripts with the useless "Untitled" names.
    """
    # only process for notebooks
    if model["type"] != "notebook":
        return
    script_exporter = ScriptExporter(parent=contents_manager)
    base, __ = os.path.splitext(os_path)
    # do nothing if the notebook name ends with `Untitled[0-9]*`
    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("Saving script at /%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

Om dit script te gebruiken, kun je het toevoegen aan ~/.jupyter/jupyter_notebook_config.py🙂

Houd er rekening mee dat u de jupyter-notebook/lab mogelijk opnieuw moet opstarten om het te laten werken.


Antwoord 12

Op mijn mint [ubuntu]-systeem op het werk, hoewel jupyter al was geïnstalleerd en notebooks werkten, gaf jupyter nbconvert --to scriptde fout geen bestand/maptotdat ik een aparte

. deed

sudo apt-get install jupyter-nbconvert

Toen was alles in orde met de conversie. Ik wilde dit gewoon toevoegen voor het geval iemand dezelfde fout zou tegenkomen (voor mij was het verwarrend omdat ik dacht dat de geen-bestandsfout naar de notebook verwees, die zeker in de lokale map stond, het kostte me een tijdje om te beseffen dat de subopdracht niet was geïnstalleerd).


Antwoord 13

Het %notebook foo.ipynbmagische commando zal de huidige IPython exporteren naar “foo.ipynb”.

Meer info door %notebook?

in te typen

Other episodes