v-crn Code Log

主に備忘録

Google Colaboratory でカスタムモジュールをインポートする

手順

1. Google Drive を Mount

from google.colab import drive
drive.mount('/content/drive')

2. sys.path.append() でパスを通してインポート

例として次のようなファイル構成になっているとする。

  • My Drive
    • Colab Notebooks
      • ML
        • workspace
          • my_module
            • __init__.py
            • my_utils.py
            • my_toolbox
              • __init__.py
              • visualizer.py

※「My Drive」が Google Drive のルートディレクト

このファイル構成で カスタムモジュール「my_module」を import するには次のように sys.path.append()モジュールの親ディレクトまでのパスをシステムに伝える必要がある。

import sys
ROOT_PATH = 'drive/My Drive/Colab Notebooks/ML/workspace/'
sys.path.append(ROOT_PATH)

import my_module

これで ModuleNotFoundError: No module named 'my_module' のようなエラーが出なければおけまる。

モジュール my_module の中のライブラリ my_utils やさらにその中のメンバーを使いたければたとえば次のように書く。

from my_module import my_utils
from my_toolbox.visualizer import hoge

visualizer.py

def hoge():
    print('hoge!')

モジュールの変更を反映する

Google Drive を再度マウントする必要がある。 Google Colaboratory のメニュータブから「Factory reset runtime」を選択し、ランタイムをリセットする。 そしていつものようにマウントするためのコードを実行すれば良い。

from google.colab import drive
drive.mount('/content/drive')

認証コードを入力してマウントが完了すれば、変更が反映されているはずだ。

ここで注意したいのは、単なる再起動 (Restart) では drive.mount('/content/drive') を実行しても Google Drive が再読み込みされないことである。その場合、認証コードを求められることなく以前の状態のドライブが適用されてしまう。

その他、強制マウントや importlib.reload を試してみたが駄目だった。

駄目な例1:強制マウント

drive.mount('/content/drive', force_remount=True)

駄目な例2:importlib.reload

import importlib
importlib.reload(module_name)

参考