もちっとメモ

もちっとメモ

もぐりのエンジニアが日々の中で試してみたことを気が向いたときに書き連ねていきます

JupyterLabで開発しながら.pyファイルを作りたい

最近、JupyterLabのβ版が公開されて、ますますJupyterでの開発が捗っている方も多いのではないでしょうか?

github.com

私もそんな一人なのですが、複数人でソースを共有したいときやflaskで作ったapiを叩くとき、Jenkinsからキックするときはやっぱり.py形式の方が使いやすい。ということで、.ipynbを保存すると同時に.pyファイルも保存してくれるやり方を探したら、ありましたのでメモっておきます。今回はこちらを参考にさせていただきました。

adtech.cyberagent.io

まず、ターミナルなどのコンソールを起動して、configを作成します。

jupyter notebook —generate-config

生成時に生成されたパスが表示されるので、そのファイルを開いて中身を書き換えます。

#c.FileContentsManager.post_save_hook = None

これを

import io
import os
from notebook.utils import to_api_path

_script_exporter = None

def script_post_save(model, os_path, contents_manager, **kwargs):
    """convert notebooks to Python script after save with nbconvert
    
    replaces `ipython notebook --script`
    """
    from nbconvert.exporters.script import ScriptExporter
    
    if model['type'] != 'notebook':
        return

    global _script_exporter
    if _script_exporter is None:
        _script_exporter = ScriptExporter(parent=contents_manager)
    log = contents_manager.log

    base, ext = os.path.splitext(os_path)
    py_fname = base + '.py'
    script, resources = _script_exporter.from_filename(os_path)
    script_fname = base + resources.get('output_extension', '.txt')
    log.info("Saving script /%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    

のように書き換えます。

これで後は実際にJupyterLabを起動して、ファイル保存をするだけで.ipynbファイルと.pyファイルが同時に生成されているはずです。

ついでに、「個別の環境にJupyterをインストールするのは面倒だよ」という場合は、オンプレOSSのようにサーバー用PCにみんなでアクセスして使うという方法があります。これもブラウザで稼働する点のメリットですね。これでユーザーはブラウザさえあれば即使えますし、バージョンやライブラリの管理も1台のPCで済みます。リモートで使うための方法はこちらが参考になります。

qiita.com