Jupytextしたい(jupytext

// notebooksをmarkdownに変換
$ jupytext --set-formats ipynb,md:myst ファイル.ipynb
$ jupytext --sync ファイル.ipynb
$ jupytext --sync ファイル.md

jupytextでノートブック(ipynb)をテキスト形式のファイルに変換/ペアリングできます。 ノートブックの使い勝手はそのままに、 Gitなどを使ったファイル管理をより簡単にするためのツールです。

注釈

Pythonのコーディングをするときにノートブックは欠かせません。 しかし、ノートブックの中身はJSON形式であるため、Gitなどで管理していてもその差分の確認は(人間には)とても難解です。 マージコンフリクトが生じたときの修正は、とてもとても大変です。

また、図などをそのままにしておくと、ipynb形式のファイルはすぐに肥大化してしまいます。 ある程度のサイズになると、Git LFSに追加する必要がでてきます。

Jupytextは、そのような課題を解決してくれます。

インストールしたい(jupytext

  • pipxでインストール

$ pipx install jupytext
  • poetryでインストール

$ poetry add jupytext --group=dev
  • uvでインストール

$ uv tool install jupytext

ペアリングしたい(--set-formats

$ jupytext --set-formats ipynb,md:myst ファイル.ipynb
[jupytext] Reading ファイル.ipynb in format ipynb
[jupytext] Updating notebook metadata with '{"jupytext": {"formats": "ipynb,md:myst"}}'
[jupytext] Updating ファイル.ipynb
[jupytext] Updating ファイル.md

--set-formatsオプションで形式を指定することで、 ファイルとファイルをペアリングできます。

上記サンプルではipynb形式のノートブックと md:myst形式のテキストファイルをペアリングしています。

注釈

// .ipynbから.mdに変換
$ jupytext --to md:myst ファイル名.ipynb

// .ipynbから.pyに変換
$ jupytext --to py:percent ファイル名.ipynb

指定したフォーマットに変換できる --to フォーマット(や--from フォーマット)オプションもあります。 このオプションはただの変換するだけで、ファイル間のペアリングはされません。 Jupytextを使うのであれば--set-formatsオプションを使えばよいと思います。

ディレクトリ分割したい

$ jupytext --set-formats notebooks//ipynb,markdowns//md:myst notebooks/*.ipynb

ノートブック用、Markdown用、スクリプト用に ディレクトリを分割したまま、ペアリングすることもできます。

参考

僕はノートブックは機能の確認や単体テスト用に作成することが多く、とりあえずnotebooksという専用のディレクトリの中で管理することにしています。 この中に同名の.mdファイルなどが作成されると、ファイルを開くときに難儀します。 なので、Jupytextで連携したファイルたちはディレクトリを分割して管理することにしています。

同期したい(--sync

$ jupytext --sync ファイル.ipynb
[jupytext] Reading ファイル.ipynb in format ipynb
[jupytext] Loading ファイル.md
[jupytext] Unchanged ファイル.ipynb
[jupytext] Updating ファイル.md

--syncオプションでファイル間の同期をとることができます。 ペアリングしたファイルであれば、どのファイルを編集してもOKです。

全体設定したい(jupytext.toml

 1# ペアリングの設定
 2# ディレクトリを分割して連携
 3[formats]
 4"notebooks/" = "ipynb"
 5"markdowns/" = "md:myst"
 6"scripts/" = "py:light"
 7
 8# ノートブックのメタデータの設定
 9notebook_metadata_filter = ""
10
11# セルのメタデータの設定
12cell_metadata_filter = ""

プロジェクトルートに配置したjupytext.toml またはpyproject.tomlに Jupytextの全体設定を記述できます。

notebook_metadata_filterで、 ノートブックのメタデータに残す情報を設定できます。

cell_metadata_filterで セルのメタデータに残す情報を設定できます。

コミットフックしたい

# .pre-commit-config.yaml
repos:
- repo: ...
- repo: https://github.com/mwouts/jupytext
  rev: v1.16.4b
  hooks:
  - id: jupytext
    args: [--sync]

pre-commit-hookも用意されています。 .pre-commit-config.yamlに追加することで、 コミット直前に自動的にファイル間の同期をとることができます。

リファレンス