【 jupytext】Jupyterファイルをより扱いやすくする(.ipynb⇔.py)


##はじめに

本記事では下記2021年ベストPythonライブラリに出てくるライブラリの中から、一番お手頃に使えそうだったjupytextを紹介します。

★**2021年Pythonベストライブラリ(TOP10)って何・・？**
・Tryolabsという企業のCTOが2015年以降で毎年最新のPythonライブラリを自社Blogで紹介してる
・2021年に公開 or 普及されはじめたライブラリのみでnumpy等の既知のライブラリは対象外
・メンテナンス等の活動も活発に行われているものが対象らしい

https://tryolabs.com/blog/2021/12/21/top-python-libraries-2021

つまり`勝手に著者が選んでるだけであり、ランキング自体にはあまり意味がない`気もします。
が、**我々が知らないような良さげなライブラリを発見できる1つの手段としてはいい機会**かな？と思いましたので記事にしようと思った次第です。


* 動作環境
 * OS : Windows10 pro
 * Python : 3.8.3
 * jupytext：1.13.4
 * jupyter notebook(JupyterLabでもOKらしい)

##jupytextに関して
jupytextはJupyter Notebookのプラグインで、`.py`と`.ipynb`の**双方向変換**を提供するものです。
要するに**jupyterで作成したプログラムの保存時に.pyを自動作成してくれ、さらにpyとipynbの相互補完機能を持つ**ライブラリです。(具体例は記事内で)


 * GitHubスター数 : 5k (5,000)
 * ライセンス ： MIT License
 * 導入 ： pip install jupytext 
 * ドキュメント ： https://jupytext.readthedocs.io/en/latest/

https://github.com/mwouts/jupytext




##jupytextの使い方

まずはjupytextをインストールします。(`pip install jupytext `)

でインストール後にJupyter Notebookを再度立ち上げます。
そしてPythonファイル(.ipynbファイル)を作成します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/803441b9-316a-009b-a5c0-9f57dd573543.png" width=70%>

さてここからがJupytextの出番ですが、使い方には以下3パターンの方法があります。
ファイルの出力場所やデフォルト設定等でご自身の一番使いやすいケースで使ってください。

###①Jupytextメニューの「jupytext」から保存形式を選択する方法
これが一番簡単です。
メニュー画面の`File>>Jupytext>>Pair Notebook with light Script`にチェックを入れるだけです。
※[(参考)lightフォーマットに関して](#参考lightフォーマットに関して)


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/d56d730a-855c-4b3d-9805-ed63b660e5da.png" width=70%>


これにチェックを入れた状態でノートブックを「保存」すると・・
**なんと自動で.pyファイルが作成されている上に、当然.pyファイルなので好きなテキストエディタで開くことが出来ます。**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/1822e33d-8cec-8989-0f4c-3dc3c459e409.png" width=70%>


さらに**.pyファイル自体もjupyterで編集することも可能です**。
Jupytextを入れる前は左下図のように`.py`ファイルはJSON形式でしか表示されないが、入れた後は`.ipynb`と同じように編集可能になる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/9ba6a138-c5b7-ca55-d79e-30ad923c6b2f.png" width=70%>


**さらに、この.pyファイルと.ipynbファイルは自動で相互保存される**為、例えば以下のように`.py`ファイルを別のエディタで編集したとしても、元の.ipynbにもその変更が反映されます。※逆もしかり

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/ec578247-c70e-0234-f573-6e9be3c3b083.png" width=70%>


これがこのライブラリの双方向変換機能になります。

###②Jupytextメニューの「Edit Notebook Metadata」で設定する方法

.pyファイルを同じディレクトリではなく、混同を防ぐために保存場所を変えたい場合はこれを使えばOK。
※例では先頭に追加してるが、場所はどこでもいい。普通は最後に追加する？

**・以下コピペ用**
`  "jupytext": {`
　`"formats": "ipynb,py_scripts//py:light",`
`  },`

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/4dc07196-b554-6bd3-ccbf-2355161b5192.png" width=70%>

すると、指定した場所に.pyが出力されまｓ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/d81434cf-0091-71e7-dcda-ed0153c919f4.png" width=70%>


###③jupyter_notebook_config.pyから設定する方法

上述2方法は毎回ファイル毎に設定が必要。
しかし、configをいじることでデフォルト設定として.pyも同時出力されるように設定可能になります。

`jupyter notebook --generate-config`でまずはconfigを作成
(※すでに以前作成してある場合はコマンドで上書きするかのyes/no問われるのと同時に出力場所が出るためそれを編集する)

**・以下コピペ用(どっちか好きな形式を選べばOK。保存場所もpy_scriptではなく変更OK)**
`c.ContentsManager.default_jupytext_formats = "ipynb,py:light"`
`c.ContentsManager.default_jupytext_formats = "ipynb,py_script//py:light"`

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/ea4bfb80-c47d-2e47-dac0-1be81cb16631.png" width=90%>

##おわりに
jupyterで書いたスクリプトを別のエディタで読みたい！等はjupyter使いあるあるだと思います。
そんな時にこのライブラリを使えば簡単に中身見れるし、相互で自動変換されるので個人的にも今後使おうと考えてます。

それでは今回はここまで。


##(参考)lightフォーマットに関して
light scriptって何者？という疑問を持たれる方がいると思うので一応触れておくと、どうやら.pyと.ipynbの変換の形式だそうで、コメントアウトの#の後にスペース＋#でマークダウンとみなす・・等の機能が備わっているらしいです。

**※他の方の書いてる解説サイトではc.ContentsManager.default_jupytext_formats = "ipynb,py"というように「:light」を書いてないケースが多かったですが、その場合どの書式に該当するかまでは今回検証してません。**

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/ce858c4f-09ff-be64-2789-0a6a1b58cc29.png)