Comment convertir un bloc-notes IPython en un fichier Python via la ligne de commande?

Je cherche à utiliser le *.ipynb fichiers comme source de vérité et les 'compilant' par programme en fichiers. py pour les tâches / tâches planifiées.

La seule façon que je comprends pour le faire est via l'interface graphique. Est-il un moyen de le faire via la ligne de commande?

122
demandé sur Cristian Ciupitu 2013-06-13 04:23:02

9 réponses

Démarrer le bloc-notes avec --script le drapeau enregistrera le fichier .py à côté de .ipynb à chaque sauvegarde. Jetez un oeil à github / ipython / nbconvert qui est actuellement fusionné dans IPython lui-même, alors ne vous attendez pas à ce que le doc soit précis et nbconvert fonctionne hors de la boîte sans travailler un peu. (./ nbconvert ) au moment d'écrire ces lignes, en [python, latex, markdown, full_html,...])

Vous pouvez également (comme ipynb est json), la charger, boucle à travers elle et eval codecell dans l'espace de noms actuel. Vous trouverez exemple ici et là sur internet ou IPython wiki sur github.

Cette réponse est trop ancienne voir la réponse de @ williampli ci-dessous.

37
répondu Matt 2017-01-06 20:22:56

Si vous ne voulez pas sortir un script Python chaque fois que vous enregistrez, ou si vous ne voulez pas redémarrer le noyau IPython:

Sur ligne de commande, vous pouvez utiliser nbconvert:

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

Comme un peu d'un hack, vous pouvez même appeler la commande ci-dessus dans Un bloc-notes IPython en pré-attente ! (utilisé pour tout argument de ligne de commande). À l'intérieur d'un Cahier:

!jupyter nbconvert --to script config_template.ipynb

Avant --to script est ajoutée, l'option a été --to python ou --to=python, mais il a été renommé dans le passage vers un système d'ordinateur portable indépendant de la langue.

230
répondu williampli 2016-07-09 16:59:25

Voici un moyen rapide et sale d'extraire le code de V3 ou v4 ipynb sans utiliser ipython. Il ne vérifie pas les types de cellules, etc.

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()
10
répondu Valentas 2015-06-11 09:10:20

Si vous voulez convertir tous les fichiers *.ipynb du répertoire courant en script python, vous pouvez exécuter la commande comme ceci:

jupyter nbconvert --to script *.ipynb
9
répondu Břetislav Hájek 2018-04-22 12:07:28

Suivant l'exemple précédent mais avec la nouvelle version de nbformat lib :

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'))
7
répondu Spawnrider 2016-07-07 14:30:01

Vous pouvez le faire à partir de L'API IPython.

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)
4
répondu justanr 2015-02-25 07:40:18

La dernière ligne de code de@Spawnrider,

fh.writelines(source.encode('utf-8'))

Donne 'TypeError: write () argument doit être str, pas int'

fh.writelines(source) 

Fonctionne cependant.

3
répondu BarryC 2016-10-18 05:43:03

Pour convertir tout *.fichiers au format ipynb dans le répertoire courant pour les scripts Python récursivement:

for i in *.ipynb **/*.ipynb; do 
    echo "$i"
    jupyter nbconvert  "$i" "$i"
done
2
répondu Don Smythe 2016-10-23 01:53:28

J'ai eu ce problème et essayé de trouver la solution en ligne. Bien que j'ai trouvé quelques solutions, ils ont encore quelques problèmes, par exemple, l'ennuyeux Untitled.txt auto-création lorsque vous démarrez un nouveau bloc-notes à partir du tableau de bord.

Donc finalement, j'ai écrit ma propre solution:

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

Pour utiliser ce script, vous pouvez l'ajouter ~/.jupyter/jupyter_notebook_config.py :)

Notez que vous devrez peut-être redémarrer le Jupyter notebook / lab pour qu'il fonctionne.

0
répondu Jiren Jin 2018-09-10 11:16:57