2013-06-13 12 views
79

Sto cercando di utilizzare i file * .ipynb come sorgente di verità e di "compilarli" in modo programmatico in file .py per lavori/attività pianificate.Come posso convertire un IPython Notebook in un file Python tramite riga di comando?

L'unico modo in cui ho capito di farlo è tramite la GUI. C'è un modo per farlo tramite la riga di comando?

+0

Che cosa si intende per "fonte di verità"? I taccuini IPython sono solo file json. Puoi caricarli e manipolarli come dizionari Python. Per il codice sorgente dovresti iterare le chiavi 'input' dove' cell_type' è uguale al 'codice'. Date un'occhiata a questo [schema] (http://i.imgur.com/Z0jSc.png) – theta

+0

Bene, voglio memorizzare .ipynb in un repository e non nei file .py. Quindi, come "passo di costruzione", convertirei .ipynb in file .py per l'uso effettivo da parte del sistema automatico. Hai ragione, potevo semplicemente caricare il json ed emettere solo le celle del codice, ma mi stavo chiedendo se c'era già qualcosa là fuori che lo faceva per me :) –

risposta

29

Avvia notebook con --script contrassegno risparmierà .py file accanto a .ipynb su ogni salvataggio. Dai uno sguardo a github/ipython/nbconvert che è attualmente in fase di fusione in IPython stesso, quindi non aspettarti che il documento sia accurato e nbconvert per funzionare immediatamente senza lavorare un po '. (./nbconvert <formato> <file.ipynb>) al momento in cui scriviamo, <formato> in [pitone, lattice, Markdown, full_html, ...])

È anche possibile (come ipynb is json), caricarlo, passarlo in loop e codecell eval nello spazio dei nomi corrente. Troverete esempi qua e là su internet o wiki IPython su github.

Questa risposta è troppo vecchia vedere la risposta di @williampli di seguito.

+0

Fantastico, grazie. Questo è quello che stavo cercando :) –

+1

Sebbene questa sia la risposta accettata, '--script' è [non ben considerato] (https://github.com/ipython/ipython/issues/3295#issuecomment-17678062). [La risposta di williampli] (http://stackoverflow.com/a/19779226/134610), basata su Jupyter (supportato) ['nbconvert'] (http://nbconvert.readthedocs.org/en/latest/), sembra preferibile . – duozmo

+0

collegamento è rotto sopra – denfromufa

158

Se non si desidera attivare uno script Python ogni volta che si salva, o non si vuole riavviare il kernel IPython:

Sulla riga di comando , è possibile utilizzare nbconvert:

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

come un po 'di un hack, si può anche chiamare il comando precedente in un notebook IPython pre-attesa ! (utilizzato per qualsiasi argomento della riga di comando). All'interno di un notebook:

!jupyter nbconvert --to script config_template.ipynb 

Prima --to script era added, l'opzione era --to python o --to=python, ma era renamed in movimento verso un sistema notebook indipendente dal linguaggio.

+4

Se ne volete uno ogni salvataggio, in 'jupyter' potete attivare' nbconvert' tramite hook pre o post-save: 'ContentsManager.pre_save_hook' abd' FileContentsManager .post_save_hook'. Aggiungi un aggancio post-salvataggio 'jupyter nbconvert --to script [notebook]' – jaimedash

+1

C'è un modo per fare il contrario di convertire da uno script python a un notebook. Per esempio - avendo alcune docstring specializzate che sono analizzate nelle celle? –

+1

converti tutti i taccuini in una cartella 'jupyter nbconvert - a script/percorso/a/notebook/*. Ipynb' – openwonk

3

È possibile farlo dall'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) 
9

Ecco un modo rapido e sporco di estrarre il codice da V3 o V4 ipynb senza utilizzare ipython. Non controlla i tipi di cella, ecc.

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() 
+0

La migliore risposta se non si desidera installare nessuno degli strumenti Jupyter. – dacracot

5

Seguendo l'esempio precedente, ma con la versione nuova 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')) 
2

@ ultima riga di codice di Spawnrider,

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

dà 'TypeError: scrittura) argomento (deve essere str, not int '

fh.writelines(source) 

funziona comunque.

2

Per la conversione di tutti i file * formato .ipynb nella directory corrente di script python in modo ricorsivo:

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

Ho dovuto aggiungere l'argomento '--to script' per evitare l'output HTML predefinito in Jupiter 4.4.0. – trojjer

Problemi correlati