Notebookでマジックコマンド%runを使用する際の注意点

DeepLabをGoogle Colaboratory上で動かそうとして発生したエラーとその解決について。
Jupyter Notebook上でPythonスクリプトを使いたいとネットを検索した時、大体のサイトではマジックコマンド"%run"を推奨している。

しかし、%runについてリファレンスを確認すると、以下のように記載されている。

This is similar to running at a system prompt python file args, but with the advantage of giving you IPython’s tracebacks, and of loading all variables into your interactive namespace for further use (unless -p is used, see below).

要するに、コードセル上で設定した変数等を持ち込むし、Pythonスクリプト中で設定した変数等をコードセルへ持ち返るということ。

これは意識して使用すれば便利な機能だが、シェルスクリプトの移植等で既存のPythonスクリプトを動かしたい場合は注意が必要になる。
具体的にDeepLabでいえば、local_test.shやdownload_and_convert_voc2012.shなどPythonスクリプトを複数回実行しているシェルスクリプトをNotebookに移植しようとするとDuplicateFlagErrorが発生する。

DuplicateFlagErrorは本来、単一のPythonスクリプト内でtf.app.flagsに同一フラグを複数回設定した時に発生する。
ところがNotebook上で%runコマンドを使用すると、Pythonスクリプト終了後もtf.app.flagsが保持されるため、次のPythonスクリプトで同名フラグを設定しようとしてDuplicateFlagErrorが発生してしまう。

解決策はマジックコマンド%runではなく、"!python"を使用してPythonスクリプトを動かすこと。

リファレンスを読んだ感じ、%runコマンドでも-pオプションを付ければいけそうに思ったが、うまく動かなかった。 ■


この記事が気に入ったらサポートをしてみませんか?