Jupyter notebookでimportできるの?

2018/06/06

一番よくわからなかったのが、自分でつくったモジュールをインポートするにはどうしたらいいのか。普段から使っている人には常識かもしれませんが、目からウロコだったので記事にしてみました。

JupyterNotebookについては、Pythonやanaconda関係をググれば必ず出てくるので参考にしてください。

JupyterNotebookは使い方が普通のエディタとは随分ちがうので食わず嫌い。pythonのお勉強にVisualStudioCode、最近はspyderを使っていました。セル内のプログラムをかんたんに実行して結果を表示。ノートは拡張子.ipynb 形式のファイルとして保存するのはわかりました。じゃあ、foo.py のなかに from bar import * って書いて、bar.pyを読み込む方法がわからなかったのですが。

解決方法は、.ipynb形式で作ったノートブックを.py形式に書き出せばよい。[File]-[Download as]-[Python .py]を選んで.ipynbファイルがあるフォルダと同じところに書き出せば、ノートブックからちゃんとimportしてくれます。でも、保存するたびに書き出すなんて面倒。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

PythonユーザのためのJupyter[実践]入門 [ 池内孝啓 ]
価格:3564円(税込、送料無料) (2019/4/15時点)

面倒なら自動化すればいい

この.py形式で書き出す部分を自動化することで、ノンストレスに使えました。

ちゃんとbarと名前をつけたノートブックの変数を、fooのノートブックからimportできています。

こちらのQiitaの記事がズバリ回答。

Jupyterの設定ファイル「~/.jupyter/jupyter_notebook_config.py」に.py形式に自動で書き出すスプリクトを追加するというわけです。

import os
from subprocess import check_call
    def post_save(model, os_path, contents_manager): 
    """post-save hook for converting notebooks to .py scripts""" if model['type'] != 'notebook': 
        return # only do this for notebooks 
    d, fname = os.path.split(os_path) 
    check_call(['jupyter', 'nbconvert', '--to', 'script', fname], cwd=d) 
    check_call(['jupyter', 'nbconvert', '--to', 'html', fname], cwd=d) 
c.FileContentsManager.post_save_hook = post_save

上のスクリプトだと、同時に.htmlファイルも出力されます。不要なら    check_call(['jupyter’, 'nbconvert’, '–to’, 'html’, fname], cwd=d) の行を消すか、前に#をつけてコメントアウトすればよいでしょう。