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

258

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

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

Стефан Кравчик
источник
1
Что вы подразумеваете под «источником правды»? Записные книжки IPython - это просто файлы JSON. Вы можете загрузить их и манипулировать как словари Python. Для исходного кода вы должны перебирать inputключи, где cell_typeравно «код». Взгляните на эту схему
тета
1
Ну, я хочу хранить .ipynb в хранилище, а не файлы .py. Поэтому в качестве шага сборки я бы преобразовал файлы .ipynb в файлы .py для реального использования автоматизированной системой. Вы правы, я мог просто загрузить json и вывести только ячейки кода, но мне было интересно, есть ли уже что-то, что сделало бы это для меня :)
Stefan Krawczyk
1
@StefanKrawczyk Можете ли вы отметить aswer как принятый? Я бы порекомендовал asnwer wwwilliam
Педрам Башири

Ответы:

414

Если вы не хотите выводить скрипт Python при каждом сохранении или не хотите перезапускать ядро ​​IPython:

В командной строке вы можете использовать nbconvert:

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

Как хакерство, вы даже можете вызвать вышеупомянутую команду в записной книжке IPython , предварительно ожидая !(используется для любого аргумента командной строки). Внутри блокнота:

!jupyter nbconvert --to script config_template.ipynb

До того, как --to scriptбыл добавлен , опция была --to pythonили --to=python, но она была переименована в сторону не зависящей от языка системы ноутбуков.

wwwilliam
источник
8
Если вы хотите одно сохранение каждый раз, jupyterвы можете активировать с nbconvertпомощью хуков до или после сохранения: ContentsManager.pre_save_hookabd FileContentsManager.post_save_hook. Вы бы добавили хук после сохраненияjupyter nbconvert --to script [notebook]
jaimedash
3
Есть ли способ сделать обратное, т.е. конвертировать из сценария Python в записную книжку. Например, иметь какие-то специализированные строки документов, которые анализируются в ячейках?
Суджен Шах
3
конвертировать все блокноты в папкуjupyter nbconvert --to script /path/to/notebooks/*.ipynb
openwonk
8
Спасибо, это работает !, но что, если я не хочу, чтобы # In[ ]:в сценарии были шрифты, я хочу, чтобы они были чистыми. Есть ли способ сделать это?
Ришабх Аграри
1
@RishabhAgrahari проверить здесь, вы можете просто настроить ЛИНТЕР jupyter-notebook.readthedocs.io/en/stable/extending/...
MichaelChirico
77

Если вы хотите преобразовать все *.ipynbфайлы из текущего каталога в скрипт Python, вы можете выполнить команду следующим образом:

jupyter nbconvert --to script *.ipynb
Бржетислав Хаек
источник
19

Вот быстрый и грязный способ извлечь код из 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()
Valentas
источник
1
Лучший ответ, если вы не хотите устанавливать какие-либо инструменты Jupyter.
dacracot
1
Мне это нравится. Но я обнаружил, что когда я загружаю формат .py из ноутбуков Jupyter, он использует окончания строк UNIX, хотя я нахожусь на Windows. Чтобы сгенерировать то же самое, добавьте newlines='\n'третий аргумент в вызове open output file. (Python 3.x)
RufusVS
16

Следуя предыдущему примеру, но с новой версией 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'))
Spawnrider
источник
В последней строке кода fh.writelines (source.encode ('utf-8')) дает 'TypeError: аргумент write () должен быть str, а не int', хотя fh.writelines (source) работает.
BarryC
6

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

Jupytext приятно иметь в вашем наборе инструментов для таких преобразований. Это позволяет не только преобразовать блокнот в сценарий, но и снова вернуться из сценария в блокнот. И даже сделать этот ноутбук в выполненном виде.

jupytext --to py notebook.ipynb                 # convert notebook.ipynb to a .py file
jupytext --to notebook notebook.py              # convert notebook.py to an .ipynb file with no outputs
jupytext --to notebook --execute notebook.py    # convert notebook.py to an .ipynb file and run it 
Wayne
источник
Видимо, есть также ipynb-py-convert, смотрите здесь .
Уэйн
«jupytext» не распознается как внутренняя или внешняя команда, работающая программа или командный файл. ???
Амин Чади
Вы установили это @AmineChadi. Смотрите здесь, как это сделать. Если вы используете его через ноутбук в качестве интерфейса командной строки, вы можете просто запустить его %pip install jupytextв своем ноутбуке.
Уэйн
3

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

for i in *.ipynb **/*.ipynb; do 
    echo "$i"
    jupyter nbconvert  "$i" "$i"
done
Дон Смит
источник
3
Мне пришлось добавить --to scriptаргумент, чтобы избежать вывода HTML по умолчанию в Jupiter 4.4.0.
trojjer
0

У меня была эта проблема, и я попытался найти решение в Интернете. Хотя я нашел некоторые решения, у них все еще есть некоторые проблемы, например, раздражающее Untitled.txtавтоматическое создание, когда вы запускаете новую записную книжку с панели инструментов.

В итоге я написал собственное решение :

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

Чтобы использовать этот скрипт, вы можете добавить его в ~/.jupyter/jupyter_notebook_config.py:)

Обратите внимание, что вам может потребоваться перезапустить ноутбук / лабораторию Jupyter, чтобы он заработал.

Jiren Jin
источник
0

Есть очень хороший пакет под названием nb_dev, который предназначен для создания пакетов Python в Jupyter Notebooks. Как будто nbconvert,он может превратить записную книжку в файл .py, но он более гибкий и мощный, потому что в нем есть много приятных дополнительных функций авторинга, которые помогут вам разрабатывать тесты, документацию и регистрировать пакеты в PyPI. Это было разработано людьми fast.ai.

В нем есть некоторая кривая обучения, но документация хорошая, и в целом это не сложно.

Джон
источник