Я дивлюсь на використання файлів * .ipynb як джерела істини і програмно «компілюю» їх у .py-файли для запланованих завдань / завдань.
Єдиний спосіб, як я розумію, це зробити через GUI. Чи є спосіб це зробити за допомогою командного рядка?
Я дивлюсь на використання файлів * .ipynb як джерела істини і програмно «компілюю» їх у .py-файли для запланованих завдань / завдань.
Єдиний спосіб, як я розумію, це зробити через GUI. Чи є спосіб це зробити за допомогою командного рядка?
Відповіді:
Якщо ви не хочете виводити скрипт Python кожного разу, коли ви зберігаєте, або не хочете перезавантажувати ядро IPython:
У командному рядку ви можете використовувати nbconvert
:
$ jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb
Як трохи хак, ви навіть можете зателефонувати вищевказаній команді в ноутбук IPython , попередньо відкладений !
(використовується для будь-якого аргументу командного рядка). Всередині блокнота:
!jupyter nbconvert --to script config_template.ipynb
Перш ніж --to script
було додано , цей варіант був --to python
або --to=python
, але він був перейменований у рух до мовно-агностичної системи зошитів.
jupyter
ви можете запустити його nbconvert
за допомогою гачок перед або після збереження: ContentsManager.pre_save_hook
abd FileContentsManager.post_save_hook
. Ви додали б гачок, який зберігається після збереженняjupyter nbconvert --to script [notebook]
jupyter nbconvert --to script /path/to/notebooks/*.ipynb
# In[ ]:
вводити в сценарій речі, я хочу, щоб вони були чистими. Чи можна це зробити?
Якщо ви хочете перетворити всі *.ipynb
файли з поточного каталогу в скрипт python, ви можете запустити команду так:
jupyter nbconvert --to script *.ipynb
Ось швидкий і брудний спосіб витягти код з 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()
newlines='\n'
як третій аргумент у виклик відкритого вихідного файлу. (Python 3.x)
Дотримуючись попереднього прикладу, але з новою версією 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'))
Це можна зробити за допомогою 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)
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 у поточному каталозі в сценарії python рекурсивно:
for i in *.ipynb **/*.ipynb; do
echo "$i"
jupyter nbconvert "$i" "$i"
done
--to script
аргумент, щоб уникнути виведення HTML за замовчуванням у Jupiter 4.4.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
:)
Зауважте, що вам може знадобитися перезапустити зошит / лабораторію з юпітером, щоб він працював.
Є дуже приємний пакет під назвою nb_dev, який призначений для створення пакетів Python в Jupyter Notebooks. Начебто nbconvert,
він може перетворити ноутбук у .py файл, але він більш гнучкий і потужний, тому що має безліч приємних додаткових функцій авторства, які допоможуть вам розробити тести, документацію та зареєструвати пакети на PyPI. Це було розроблено фаст-айдами.
Він має трохи кривої навчання, але документація хороша і загалом це не складно.
input
ключами, щоcell_type
дорівнює "коду". Подивіться на цю схему