タイトルの通りで、Jupyter notebookファイル (.ipynb ファイル)をモジュールとしてインポートする方法を紹介します。
僕は普段のコーディングをJupyterでやっているので、自分で使う汎用的なモジュールを作るときも一度Jupyterで作って.pyファイルに移行するという手順で作っていました。一回完成させて仕舞えばそれでいいのですが、作りかけのものを別のプログラムで使いたいとか、それに限らず、あるnotebookで定義した関数を別のnotebookで使いたい、ってときにこれまでセルの中身をコピペしてたのですが、実はnotebookファイルのままimportできるという噂を聞き試しました。
機械学習の前処理とか何度も同じコードを書いてるので使いまわせる様になると便利そうです。
使うのはこちらの importnb というライブラリです。
参考: importnb · PyPI
とりあえず試してみましょう。
importされる側のnotebookファイルを以下の内容で作ります。importできることの確認だけなので、適当なメソッドと定数が定義されているだけのファイルです。
ファイル名は sub_file.ipynb としました。
def foo():
return "bar"
hoge = "hoge"
では、このファイルをimportしてみましょう。
importnb sub_file とかで済むと簡単なのですが、やや独特な記法でimportします。先ほどのsub_file.ipynb は閉じて新しいnotebookファイルで以下の様に書きます。
from importnb import imports
with imports("ipynb"):
import sub_file
これでimportできました。
メソッド foo や 変数 hoge が使えます。
print(sub_file.foo())
# bar
print(sub_file.hoge)
# hoge
少し検証してみたのですが、このライブラリはimportされるnotebookの中身によっては注意して使う必要があります。というのも、notebookを import するときにimport されるnotebookの全てのセルが実行されるのです。なので、何かファイルを書き出す処理があればimportした時点でファイルを書き出ししますし、重い処理があれば時間かかりますし、外部APIを叩く処理が入っていたら外部APIを叩きます。
宣言されているメソッドやクラス、変数だけを持ってきて使えると言うわけでは無いのでimportするnotebookは慎重に選びましょう。
というか、その確認作業をするのであれば .py ファイルに書き出すとか必要なセルだけコピペして持ってくるといった対応をする方が早いことが多く、この importnb を使う場面ってかなり限られるなぁと言うのが自分の所感です。
頻繁に使っうMeCabを使った前処理とかワードクラウドクラウド作成とか汎用的なSQLとか自分が頻繁に使うメソッドや定数をまとめた神notebook集を用意したりするとまた活用の幅も出てくるかもしれませんね。
もう一点、検証時に気付いた注意点があります。これ、notebookのセルを全て実行するので、その中に一つでもエラーになるセルがあったらimportを失敗します。
そのエラーになるセルより先に実行されたセルの中身だけimportされるのではなく、何もimportされない結果になります。これも注意しましょう。