Am'm uit la utilizarea *.ipynb fișiere ca sursă a adevărului și programatic 'întocmirea' le în .py fișierele de locuri de muncă programate/sarcini.
Singurul mod de a înțelege pentru a face acest lucru este prin intermediul GUI. Există o modalitate de a face prin linia de comandă?
Dacă tu nu't doriți să ieșire un script Python de fiecare dată când salvați, sau tu nu't doriți să reporniți IPython kernel:
Pe în linia de comandă, puteți utiliza nbconvert
:
$ jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb
Ca un pic de un hack, puteți apela chiar comanda de mai sus în o IPython notebook de pre-curs !
(folosit pentru orice argument în linia de comandă). În interiorul unui notebook:
!jupyter nbconvert --to script config_template.ipynb
Înainte de --a script
a fost adaugă, opțiunea a fost --să python " sau " --a=python
, dar a fost redenumit în mișcarea spre o limbă-agnostic notebook-uri de sistem.
Dacă doriți pentru a converti toate `*.ipynb fișierele din directorul curent pentru python script, puteți rula comanda astfel:
jupyter nbconvert --to script *.ipynb
Aici este un mod rapid și murdar mod de a extrage codul de V3 sau V4 ipynb fără a utiliza ipython. Nu verifica tipuri de celule, 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()
Urmând exemplul precedent, dar cu nou nbformat lib versiune :
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'))
Puteți face acest lucru de la 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)
Pentru a converti toate *.ipynb format fișiere în directorul curent de scripturi python recursiv:
for i in *.ipynb **/*.ipynb; do
echo "$i"
jupyter nbconvert "$i" "$i"
done
Am avut această problemă și a încercat să găsească o soluție on-line. Deși am găsit câteva soluții, ei încă mai au unele probleme, de exemplu, enervant Untitled.txt auto-creație, atunci când începe un nou notebook de la tabloul de bord.
Deci, în cele din urmă am scris propria mea soluție:
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
Pentru a folosi acest script, puteti adauga la ~/.jupyter/jupyter_notebook_config.py
:)
Rețineți că poate fi necesar să reporniți jupyter notebook / laborator pentru a funcționa.