Як перетворити ноутбук IPython у файл Python за допомогою командної лінії?


258

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

Єдиний спосіб, як я розумію, це зробити через GUI. Чи є спосіб це зробити за допомогою командного рядка?


1
Що ви маєте на увазі під "джерелом істини"? Ноутбуки IPython - це лише файли json. Ви можете завантажувати їх і маніпулювати ними як словники Python. Для вихідного коду ви повинні бути ітераційними inputключами, що cell_typeдорівнює "коду". Подивіться на цю схему
theta

1
Ну я хочу зберігати .ipynb у сховищі, а не у файлах .py. Тож як "крок збирання" я перетворив би .ipynb в .py файли для фактичного використання автоматизованою системою. Ви маєте рацію, я міг просто завантажити json і вивести лише клітини коду, але мені було цікаво, чи щось там вже було для мене :)
Stefan Krawczyk

1
@StefanKrawczyk Ви можете, будь ласка, позначити відмітку як прийняту? Я б рекомендував asnwer wwwilliam
pedram bashiri

Відповіді:


413

Якщо ви не хочете виводити скрипт Python кожного разу, коли ви зберігаєте, або не хочете перезавантажувати ядро ​​IPython:

У командному рядку ви можете використовувати nbconvert:

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

Як трохи хак, ви навіть можете зателефонувати вищевказаній команді в ноутбук IPython , попередньо відкладений !(використовується для будь-якого аргументу командного рядка). Всередині блокнота:

!jupyter nbconvert --to script config_template.ipynb

Перш ніж --to scriptбуло додано , цей варіант був --to pythonабо --to=python, але він був перейменований у рух до мовно-агностичної системи зошитів.


8
Якщо ви хочете отримати кожне збереження, jupyterви можете запустити його nbconvertза допомогою гачок перед або після збереження: ContentsManager.pre_save_hookabd FileContentsManager.post_save_hook. Ви додали б гачок, який зберігається після збереженняjupyter nbconvert --to script [notebook]
jaimedash

3
Чи є спосіб зробити реверс, тобто перетворити з сценарію python в ноутбук. Для того, щоб мати деякі спеціалізовані docstrings, які розбираються в клітинки?
Sujen Shah

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

1
Найкраща відповідь, якщо ви не хочете встановлювати жоден інструмент Jupyter.
дакракот

1
Мені подобається це. Але я дізнався, коли завантажую .py формат із ноутбуків Юпітера, він використовує закінчення рядків UNIX, хоча я перебуваю на Windows. Щоб генерувати те саме, додайте newlines='\n'як третій аргумент у виклик відкритого вихідного файлу. (Python 3.x)
RufusVS

16

Дотримуючись попереднього прикладу, але з новою версією lib nbformat :

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'))

Останній рядок коду, fh.writlines (source.encode ('utf-8')) дає 'Аргумент TypeError: write () повинен бути str, а не int', хоча fh.writlines (джерело) працює.
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)

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 

Мабуть, є і ipynb-py-conver, дивіться тут .
Уейн

"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:)

Зауважте, що вам може знадобитися перезапустити зошит / лабораторію з юпітером, щоб він працював.


0

Є дуже приємний пакет під назвою nb_dev, який призначений для створення пакетів Python в Jupyter Notebooks. Начебто nbconvert,він може перетворити ноутбук у .py файл, але він більш гнучкий і потужний, тому що має безліч приємних додаткових функцій авторства, які допоможуть вам розробити тести, документацію та зареєструвати пакети на PyPI. Це було розроблено фаст-айдами.

Він має трохи кривої навчання, але документація хороша і загалом це не складно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.