Jupyter notebookをnbconvertでスクリプト化して実行する時に「NameError: name ‘get_ipython’ is not defined」がエラーが出る時の原因と対処法

Python
元教師
元教師

こんにちは!データサイエンティストの青木和也(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やマジックコマンドは削除しておくようにしましょう!

コメント

タイトルとURLをコピーしました