Я рассматриваю файлы *. ipynb как источник правды и программно "компилирую" их в .py файлы для запланированных заданий/задач.
Единственный способ понять это - через графический интерфейс. Есть ли способ сделать это через командную строку?
Я рассматриваю файлы *. ipynb как источник правды и программно "компилирую" их в .py файлы для запланированных заданий/задач.
Единственный способ понять это - через графический интерфейс. Есть ли способ сделать это через командную строку?
Запустить блокнот с флагом --script
сохранит .py
файл вместе с .ipynb
при каждом сохранении.
Посмотрите github/ipython/nbconvert, который в настоящее время сливается с самим IPython, поэтому не ожидайте, что документ будет точным, а nbconvert - работать из коробки, не работая немного. (./nbconvert <format> < file.ipynb > ) во время этой записи, <format> в [ python, латекс, markdown, full_html,...])
Вы также можете (как ipynb is json), загрузить его, пропустить через него и eval
codecell в текущем пространстве имен. Вы найдете пример здесь и там в Интернете или IPython wiki на github.
Этот ответ слишком стар, см. ниже ответ @williampli.
Если вы не хотите выводить Python script при каждом сохранении или не хотите перезапускать ядро IPython:
В командной строке вы можете использовать nbconvert
:
$ jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb
Как немного взломать , вы можете даже вызвать указанную выше команду в ноутбуке IPython, предварительно ожидая !
(используется для любого аргумента командной строки). Внутри ноутбука:
!jupyter nbconvert --to script config_template.ipynb
До --to script
был добавлен , опция была --to python
или --to=python
, но она была переименован при переходе к языковой адаптивной системе ноутбуков.
Вот быстрый и грязный способ извлечь код из V3 или V4 ipynb без использования ipython. Он не проверяет типы ячеек и т.д.
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()
Следуя предыдущему примеру, но с новой версией 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'))
Вы можете сделать это из 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)
@Spawnrider последняя строка кода,
fh.writelines(source.encode('utf-8'))
дает 'Аргумент TypeError: write() должен быть str, а не int'
fh.writelines(source)
работает.
Для преобразования всех файлов формата *.ipynb в текущий каталог в сценарии python рекурсивно:
for i in *.ipynb **/*.ipynb; do
echo "$i"
jupyter nbconvert "$i" "$i"
done