Open12
Jupytextしたい
Jupytext
- Jupyter Notebook(
.ipynb
)をMarkdown(.md
)やPythonスクリプト(.py
)に変換できるツール - 変換した
.ipynb
、.md
、.py
ファイルをペアリングして同期できる -
.ipynb
のGit管理から解放される
インストール
-
pipx
でインストール
pipx
$ pipx install jupytext
-
poetry
でインストール(--group=dev
にした)
poetry
$ poetry add jupytext --group=dev
-
uv
でインストール
uv
$ uv tool install jupytext
基本コマンド
pair & sync
// ノートブック(.ipynb)を他の形式(md:mystとpy:light)をペアリング
$ jupytext --set-formats ipynb,md:myst,py:light ノートブック.ipynb
[jupytext] Reading ファイル.ipynb in format ipynb
[jupytext] Updating notebook metadata with '{"jupytext": {"formats": "ipynb,md:myst"}}'
[jupytext] Updating ファイル.ipynb
[jupytext] Updating ファイル.md
[jupytext] Updating ファイル.py
// ノートブックを編集したあと、他のファイルと同期
$ jupyter --sync ノートブック.ipynb
[jupytext] Reading ファイル.ipynb in format ipynb
[jupytext] Loading ファイル.md
[jupytext] Unchanged ファイル.ipynb
[jupytext] Updating ファイル.md
[jupytext] Updating ファイル.py
- いろいろなオプションがあるが、メインは上の2つ(たぶん)
-
--set-formats SET_FORMATS
: ペアリング -
--sync
: 同期
ディレクトリを指定
ディレクトリ構造
$ tree
PROJECT_ROOT/
|-- notebooks/ # .ipynbを保存
|-- markdowns/ # .mdを保存
|-- scripts/ # .mdを保存
- ペアリングしたファイルは、デフォルトで同じ階層に作成される
- ノートブックが大量にある場合、上のように、ファイルの種類ごとにディレクトリを分けて管理したほうがよいと思う
-
--set-formats
オプションで、ディレクトリを分けることができる
PROJECT_ROOT
// notebooks/*.ipnyb のノートブックをまとめて変換&ペアリング
$ jupytext --set-formats notebooks//ipynb,markdowns//md:myst,scripts//py:light notebooks/*.ipynb
- ディレクトリの指定は
ディレクトリ//フォーマット
のように記述する
PROJECT_ROOT
// まとめて同期できる
$ jupytext --sync notebooks/*.ipynb
-
--sync
もまとめて同期できる
jupytext.toml
)
全体設定( jupytext.toml
[formats]
"notebooks/" = "ipynb"
"markdowns/" = "md:myst"
"scripts/" = "py:light"
- プロジェクトルートに
jupytext.toml
を配置して、全体設定できる - ディレクトリ別に管理する場合は、このファイルに書いてから実行したほうがよい
- なお、単体ファイルの設定は、全体設定より優先される
PROJECT_ROOT
$ jupyter --sync notebooks/*.ipynb
$ jupyter --sync markdowns/*.md
$ jupyter --sync scripts/*.py
-
jupytext.toml
の[formats]
の設定があれば、jupyter --sync
するだけでOK - どのディレクトリに対して実行してもOK
- (ただし、ノートブックを基準に変換するユースケースが多いと思う)
追加の設定
jupytext.toml
notebook_metadata_filter = ""
cell_metadata_filter = ""
[formats]
"notebooks/" = "ipynb"
"markdowns/" = "md:myst"
"scripts/" = "py:light"
VS Codeでの作業
-
Jupytext for Notebooks
というVS Code拡張があるが、使い方がまだわかっていない - なので、原始的な作業フローにしている
- 空のipynbファイルを作成する
$ touch notebooks/NEW_NOTEBOOK.ipynb
- VS Codeで編集する
$ code notebooks/NEW_NOTEBOOK.ipynb
- jupytextで変換する
$ jupytext --sync notebooks/*.ipynb
- 追加の編集はmdファイルにする
$ code markdowns/NEW_NOTEBOOK.md
- jupytextで同期する
$ jupytext --sync notebooks/*.ipynb
[jupytext] Loading notebooks/NEW_NOTEBOOK.ipynb
[jupytext] Loading markdowns/NEW_NOTEBOOK.md
[jupytext] Updating notebooks/NEW_NOTEBOOK.ipynb
[jupytext] Updating scripts/NEW_NOTEBOOK.py
[jupytext] Unchanged markdowns/NEW_NOTEBOOK.md
- Git管理する
// 関係するファイルをまとめてステージ
$ git add notebooks/NEW_NOTEBOOK.ipynb
$ git add scripts/NEW_NOTEBOOK.py
$ git add markdowns/NEW_NOTEBOOK.md
// ひとつのコミット
$ git commit
フォーマットの種類
- Markdown用
- スクリプト用
- ノートブック用
Markdown用
-
md
: 標準的なMarkdown -
md:myst
: MyST Markdown(Sphinx拡張) -
md:pandoc
: Pandoc Markdown(Pandoc拡張) -
Rmd
: R Markdown
スクリプト用
-
py
: 標準的なPython -
py:percent
: セルマーカー(# %%
)あり(Jupyter Notebookと互換性がある形式。他のIDEでもセルを認識できる) -
py:light
: セルマーカーなし(Jupytext専用の形式。コードがすっきりする) -
R
/R:percent
/R:light
: R(# %%
) -
jl
/jl:percent
/jl:light
: Julia(# %%
) -
cpp
/cpp:percent
/cpp:light
: C++(// %%
) -
js
/js:percent
/js:light
: JavaScript(// %%
) -
ts
/ts:percent
/ts:light
: TypeScript(// %%
)
フォーマットの選び方
- Sphinxを使うならば
md:myst
がよさそう - 他のIDEは使わないならば
py:light
でよさそう - 広く共同編集するなら
py:percent
にする
pre-commitフック
repos:
- repo: https://github.com/mwouts/jupytext
rev: v1.14.7
hooks:
- id: jupytext
args: [--sync]
- https://jupytext.readthedocs.io/en/latest/using-pre-commit.html
- pre-commitフックを設定して、コミットを作成時に
jupytext --sync
できる- 通常はファイルが変更されたときに
jupytext --sync
が走る - フックも設定しておくことで、同期忘れを防ぐことができる(かもしれない)
- 通常はファイルが変更されたときに
$ pre-commit autoupdate
$ pre-commit run jupytext
-
pre-commit autoupdate
でrev
を最新版に更新できる -
pre-commit run jupytext
で手動でフックを実行できる