Google ColabでDrive上のPythonモジュールをimport!エラーを解決する手順

プログラミング学習やデータ分析を進める際、Jupyter Notebook (Colab) で作成した便利な関数をモジュールとして整理し、他のプログラムで再利用したい場面はよくあります。
しかし、Google Drive上のファイルは、Colabの実行環境である仮想マシン(VM)から見つけにくい「外部の場所」にあるため、単純にimportコマンドを実行しても、ファイルが見つからずモジュール読み込みエラーが発生してしまいます。
ここでは、モジュールファイルをローカルで作成・アップロードする方法を前提として、この問題を解決するための確実な手順と、その裏側でPythonがファイルを探すリスト(sys.path)を操作する仕組みについて解説したいと思います。
仕組みの概要:パスとキャッシュの役割
カスタムモジュールをColabで利用可能にするには、以下の2つの技術的なステップが必要です。
1. Pythonにファイルの場所を教える(パスの設定)
ColabのコードはGoogleが用意した仮想マシン(VM)上で動いています。VMにDriveをマウント(接続)した後、Pythonの検索リストである sys.path にモジュールフォルダの場所を追加してあげる必要があります。
【マウントとは?】
マウントとは、外部ストレージであるGoogle Driveを、Colabの実行環境(VM)のファイルシステムに論理的に接続し、あたかもVM内にあるかのように扱えるようにする操作のことです。この接続がないと、Drive内のファイルはPythonから認識できません。
2. 古い情報を捨てる(キャッシュの管理)
モジュールを1度読み込むと、Pythonはその情報をメモリに保存(キャッシュ)します。ファイルの内容を修正しても、キャッシュが残っていると古いコードを使い続け、エラー(AttributeError)の原因となります。そのため、インポート前にこのキャッシュを削除する必要があります。
注意点:モジュールファイルの作成と拡張子の変更について
モジュールファイル(例: remove_multiple.py)は、必ずローカルのテキストエディタで作成し、Google Driveにアップロードしてください。
Colabノートブック内で直接、マジックコマンド(%%writefile など)を使って拡張子を .pyにしてファイルを作成したり、Colabのファイルタブ内でファイルを編集したりすると、ファイルのパーミッション(権限)や文字コードの問題が発生しやすく、コードが正しくてもモジュールのインポートがスムーズにいかない原因となることがあります。
また、Jupyter Notebook/Colab形式のファイル(.ipynb)を、拡張子だけを.pyに変更してもモジュールとしては使えません。.ipynbファイルには、実行コードの他に、セルの情報や実行結果などのJSON形式のデータが大量に含まれているためです。モジュールとして使うには、純粋なPythonコード(実行文ではない関数定義など)のみが記述された.pyファイルが必要です。ローカルで作成したファイルをDrive経由で読み込むのが最も確実な手順です。
Pythonモジュールのimportと実行
ここからはサンプルを交えて説明していきます。
タスクリストから指定された不要なステータス(完了や保留など)の項目を除外して、残りのタスクだけを取り出すプログラムになります。
モジュールファイルを「remove_multiple.py」、モジュールを呼び出すファイルを「remove_multiple_test.ipynb」とします。
モジュールファイルの作成
1度作成したモジュールとして利用したいプログラムは、関数定義(def)やクラス定義(class)のみのファイルとしてください。
Colabノートブックで動いているコードから、関数定義部分だけをコピーし、ローカルのテキストエディタ(VS Code, Sublime Text, メモ帳など)で新しいファイルを作成して貼り付け、.py拡張子で保存します。
remove_multiple.py
def remove_multiple(data_list, targets):
return [item for item in data_list if item['status'] not in targets]

その後、ローカルのテキストエディタで作成したモジュールファイルをGoogle Driveにアップロードします。
実行コード
以下、remove_multipleモジュールを利用するサンプルコードになります。
remove_multiple_test.py
import sys
from google.colab import drive
import importlib
# Drive マウント (認証を求められます)
drive.mount('/content/drive')
# パス設定
MODULE_FOLDER_PATH = '/content/drive/MyDrive/module_test'
# システムパスに追加
if MODULE_FOLDER_PATH not in sys.path:
sys.path.append(MODULE_FOLDER_PATH)
# 以前のモジュール情報を完全にクリア(強制リロード)
if 'remove_multiple' in sys.modules:
del sys.modules['remove_multiple']
# インポートの実行
import remove_multiple
# 辞書のリスト(タスクデータ)を original_tasks に定義
original_tasks = [
{'id': 101, 'name': '報告書作成', 'status': 'WIP'}, # 作業中(Work In Progress)
{'id': 102, 'name': 'メール確認', 'status': 'DONE'}, # 完了
{'id': 103, 'name': '会議資料準備', 'status': 'TODO'}, # 未着手
{'id': 104, 'name': 'データ整理', 'status': 'BLOCKED'}, # ブロック(保留)
{'id': 105, 'name': 'A社への連絡', 'status': 'DONE'}, # 完了
]
# targets に除外したい「ステータスの値」を定義
tasklist = remove_multiple.remove_multiple(original_tasks, ['DONE', 'BLOCKED'])
print(f'実行待ちタスク: {tasklist}')
上記のコードは、「接続とパス設定」、「キャッシュクリア」、「実行」という3つのフェーズで構成されています。
1. 接続とパス設定の処理
まず、このプログラムは import sys や from google.colab import drive によって、Pythonのシステム設定を操作する機能とDrive接続に必要な機能を読み込みます。
次に、drive.mount(‘/content/drive’) を実行してGoogle DriveをColabの仮想マシンに接続し、ファイルアクセスを可能にします。
モジュールが置かれている場所は MODULE_FOLDER_PATH に定義され、if MODULE_FOLDER_PATH not in sys.path: sys.path.append(MODULE_FOLDER_PATH) のブロックで、Pythonのモジュール検索リストである sys.path にDriveのフォルダパスを追加します。これにより、Pythonがファイルを見つけられるようになります。
2. キャッシュのクリア処理
モジュール開発において極めて重要なのがキャッシュクリアです。
if ‘remove_multiple’ in sys.modules: del sys.modules[‘remove_multiple’] の行は、Pythonのモジュールキャッシュを強制的に削除しています。これは、ファイルを修正した後に古いバージョンのコードが誤って読み込まれる問題を防ぐための最も重要な処理です。
3. インポートと実行
キャッシュがクリアされ、パスが設定された状態で、import remove_multiple が実行され、モジュールが読み込まれます。
その後、プログラムはタスクリスト(original_tasks)を定義し、
tasklist = remove_multiple.remove_multiple(original_tasks, [‘DONE’, ‘BLOCKED’]) の行でモジュール内の関数を呼び出し、リストから指定されたステータス(DONE や BLOCKED)の項目を除外する処理を実行します。
最後に print() で結果を出力します。

この手順を踏むことで、Colabのパスやキャッシュに邪魔されることなく、Drive上のカスタムモジュールを安定して利用できます。
複数のモジュールをimportする場合
複数のモジュールを読み込む際も同じように、接続とパス設定、キャッシュのクリアを行います。
以下の2パターンをご紹介します。
シンプルな逐次処理パターン
モジュールごとにキャッシュクリアとインポートを繰り返す、分かりやすいパターンです。
# 以前のモジュール情報を完全にクリア(強制リロード)
if 'remove_multiple' in sys.modules:
del sys.modules['remove_multiple']
# インポートの実行
import remove_multiple
# 2つ目のモジュールを追加する場合 (例: data_parser)
if 'data_parser' in sys.modules:
del sys.modules['data_parser']
# インポートの実行
import data_parser
リストとループによる統合パターン
リストとループを活用する方法は、読み込みたいモジュールが増えてもコードが長くならず、管理が容易になります。importlib.import_module() を使用して、文字列として定義したモジュール名を動的にインポートします。
# 読み込みたいモジュール名をリストに定義
MODULES_TO_LOAD = ['remove_multiple', 'data_parser'] # data_parserは仮のモジュール名
# リストを使ってキャッシュクリアとインポートを一度に実行
for module_name in MODULES_TO_LOAD:
# 以前のモジュール情報を完全にクリア(強制リロード)
if module_name in sys.modules:
del sys.modules[module_name]
# インポートの実行(文字列名をモジュールとして読み込む)
# globals()[module_name] にインポート結果を格納することで、
# remove_multiple や data_parser として直接アクセス可能になる
globals()[module_name] = importlib.import_module(module_name)
この統合パターンでは、globals() 辞書を使って、動的にインポートしたモジュールをプログラム内で正式な変数名として登録しているため、インポート後に remove_multiple.関数名 のようにアクセスすることが可能です。
まとめ
Google ColabでGoogle Drive上のカスタムモジュールを安定して利用するためには、Driveマウントによるファイルシステムの接続、sys.path へのフォルダパスの追加、そしてモジュール更新時のキャッシュクリアの3ステップが不可欠です。
これらの手順を踏むことで、モジュールがいくつあっても、確実に最新のコードを呼び出すことができます。
Google Colabでカスタムモジュールを利用する際は、ぜひ参考にしてください。