Как конвертировать IPython Notebook в файл Python через командную строку?

Я рассматриваю файлы *. ipynb как источник правды и программно "компилирую" их в .py файлы для запланированных заданий/задач.

Единственный способ понять это - через графический интерфейс. Есть ли способ сделать это через командную строку?

Ответ 1

Запустить блокнот с флагом --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.

Ответ 2

Если вы не хотите выводить 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, но она была переименован при переходе к языковой адаптивной системе ноутбуков.

Ответ 3

Вот быстрый и грязный способ извлечь код из 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()

Ответ 4

Следуя предыдущему примеру, но с новой версией 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'))

Ответ 5

Вы можете сделать это из 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)

Ответ 6

@Spawnrider последняя строка кода,

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

дает 'Аргумент TypeError: write() должен быть str, а не int'

fh.writelines(source) 

работает.

Ответ 7

Для преобразования всех файлов формата *.ipynb в текущий каталог в сценарии python рекурсивно:

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