
こんにちは!データサイエンティストの青木和也(https://twitter.com/kaizen_oni)です!
今回の記事では、from nbdev.export import notebook2scriptを実行するとImportErrorが発生する場合の対処法についてご紹介します!
修正版のコードやその他のつまづき事項についても丁寧に解説していくので、お困りの方はぜひ一読ください!
元コードを見てみる
それではエラーが発生するコードを見てみましょう。
以下のコードは「Practical Deep Learning for Coders」というディープラーニングについて解説する動画の中で、Jupyter notebookのプログラム化したい部分のみをpyファイルに書き出す手順で登場したコードです。
参考動画:Lesson 2: Practical Deep Learning for Coders 2022 (49:13で登場します)
nbdevライブラリが適切にインストールされている状態で以下のコードを実行するとImportErrorが発生します。
from nbdev.export import notebook2script
notebook2script('app.ipynb')

エラーメッセージを見てみると、「nbdev.exportからnotebook2scriptなんてメソッドはインポートできないよ?」と言われているようです。
ImportErrorの原因は?
原因は至って簡単でnbdevの仕様変更によるものです。
nbdevライブラリのexportの仕様を見てみると、notebook2scriptというメソッドは存在しないことがわかります。

参考リンク:https://nbdev.fast.ai/api/export.html#nb_export
それでは、私たちはどのようにコードを変更すればJupyter notebookの一部をpyスクリプトとして出力する便利機能を使うことができるのでしょうか?
修正版のコード
以下がImportErrorを解決する修正版のコードになります。
[notebook_name]のところには、出力したいJupyter notebookの.pynb以前の名前を入力してください。
from nbdev.export import nb_export
nb_export('[notebook_name].ipynb', './')
Jupyter notebook内に適切に「#|default_exp」と「#|export」を配置した状態で上記のコードを実行すると、「#|default_exp」で指定した名前のpyスクリプトを出力することができます。
なお、nb_exportの第2引数でpyファイルをどこに出力するかを指定しています。
デフォルトでは現在のカレントディレクトリ名と同じディレクトリを現在の階層に作成して、そこにpyファイルを出力する謎仕様なので、上記コードのように「’./’」とカレントディレクトリに出力することを明示しておいた方が良いでしょう。

「#|default_app」と「#|export」の使い方
Jupyter notebookをpyスクリプトに変換するだけならば、ターミナル上で以下のコードを実行するだけでも事足ります。
jupyter nbconvert --to script [notebook_name].ipynb
そんな中でもわざわざnbdevライブラリを使って変換する理由は、「指定したセルだけpyスクリプト化できること」にあります。
例えば、上のセルは使いたいけど、下のセルはプログラムに入れたくない場合は、上のセルの最初の部分に「#|export」と書き足せばOKです。

これを入れることによって「|#export」が入っているセルだけpyスクリプト化することができます。
また、忘れてはならないのが、一番最初のセルに「|#default_exp [プログラム名]」を書き加えて、出力後のpyファイルの名前を指定することです。

これを入れないとうまく動作しないことがあります。
※「#|default_exp」がない場合はJupyter notebookの名前でpyファイルを出力するはずだ、と動画の教授はおっしゃっていたのですが、私の環境では再現できませんでした。
※うまくいった方がいらっしゃいましたらコメントでご指摘いただけると幸いです。
まとめ
今回の記事では、from nbdev.export import notebook2scriptでImportErrorが出てしまった時の対処法について解説いたしました!
nbdevのドキュメントを見てみると、GithubPagesと連携したり、いろいろな使い方ができそうなので、私はもうちょっと深堀りしてみようと思います!
皆さんも困り事のお役に立てていましたら幸いです!
コメント