こんにちは!データサイエンティストの青木和也(https://twitter.com/kaizen_oni)です!
この記事では、Jupyter notebookをnbconvertやnbdev.export.nb_exportを使ってスクリプト化した際に、Python3で実行をすると「NameError: name ‘get.ipython’ is not defined」というエラーが出てしまう際の対処法について紹介します!
「Jupyter notebookの時はうまくいったのに、、、」と頭を抱えている方の助けとなれば幸いです!
NameErrorの原因
NameErrorが出る原因は、「Jupyter notebookやJupyter Labでしか機能しないコマンドをpyスクリプトで無理やり動かそうとしているから」です。
例えば、Jupyter notebookで以下のようなコマンドを実行したことはないでしょうか。
!pip install selenium
上記のコマンドはターミナルでpip installするように、Jupyter notebook上でもpip installすることを可能にするコマンドです。
また、以下のようなコマンドを実行したことはないでしょうか。
%%time
for index, row in df.iterrows():
df.at[index, 'target'] = 1 if '<= 50k' else 0
上記のコマンドはfor文の実行にかかった時間を出力してくれるコマンドです。
上記2つの特殊なコマンドはJupyter notebookやJupyter Labでしか作動しません。
それでは、そのようなJupyter notebook専用の特殊なコマンドを含んだnotebookをnbconvertを使ってpyスクリプトに変換するとき、それらのコマンドはどのように扱われているのでしょうか。
実は、その変換後の姿こそ、「get_ipython()」なのです。
NameErrorの対処法
上記NameErrorに対する対処法は以下の2つです。
- 変換前のJupyter notebookから「!」や「%%」などの含むコマンドを消す、またはコメントアウトする
- 変換後のpyスクリプトから「get_ipython()」を消す、またはコメントアウト
つまりは、get_ipython()に関する部分が生まれないようにする、もしくは生まれたらエラーが出ないように潰しておくことが最善手になります。
補記:そもそもIPythonをインストールしていなかった場合
実は今回のエラーはIPythonがインストールされていることが前提になります。
IPythonがインストールされていないと、nbconvert時にも「IPython入ってないからIPython用の文法をピュアPython用のコードに書き換えられないで」と言ってきますし、変換後のpyスクリプトを見ても、「!pip install」や「%%time」などのJupyter用の文法がそのまま記載されていることがわかります。
どちらにせよ、このままでもpyスクリプトは実行できないので、変換前か後に当該コードをコメントアウトまたは削除しておくしかありません。
補記: nbconvertするときに他に注意すべきこと
nbconvertする時の他に注意することとして以下があります。
- displayはコメントアウトまたは削除しておく
まとめ
今回の記事では、Jupyter notebookをnbconvertした際に「NameError: name ‘get_ipython’ is not defined」エラーが発生する際の原因と対処法を紹介しました!
皆さんもnbconvertを使ってリモートGPUでバックグラウンド起動するためのスクリプト化をするときは、忘れずにpip installやマジックコマンドは削除しておくようにしましょう!
コメント