2019年1月時点の情報です。
Google Drive上の.pyファイルをインポートしようとした時に、Google Driveのマウント方法が古いものが検索で出てきたり、Google Drive上の変更がノートブックにはすぐには反映されないことに気づかずに余計な時間を使ってしまったのでシェアしておきます。
ディレクトリ構成
Google Drive上で以下のディレクトリを作成しているものとします。
マイドライブ > Colab > my_project
my_projectの中身は以下のようになっています。
my_note.ipynb が Colaboratoryのノートブックです。
my_project/
├ my_note.ipynb
└ my_modules/
├ module1.py
└ module2.py
Google Drive をマウント
古い方法だとややこしいですが、現在は以下で簡単にマウントできます。
参考: Google ColaboratoryでGoogle Driveのファイルを読み込んでPythonで操作
from google.colab import drive
drive.mount('/content/drive')
(2019/12/8 追記:左ペインを開いて、「ファイル」 → 「ドライブをマウント」を選択すると、同様のコードがセルに展開されるようになっていたようです)
実行すると認証用のURLが表示されますので、リンク先で認証後に表示されるコードを入力するとマウントされます。
Go to this URL in a browser: https://accounts.google.com/o/oauth2/...
Enter your authorization code:
··········
Mounted at /content/drive
インポート
sys.path.append()でパスを通せばインポートできます。
import sys
sys.path.append('/content/drive/My Drive/Colab/my_project/my_modules')
import module1
module1.hello()
注意点
- Google Drive上の見かけと実際のディレクトリの構造が違うので、見かけ上でファイルが正しく配置されていてもパスを通さないとインポートできません。
from my_modules import module1 # パスを通していない
実行結果
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-5-bf86f25662ae> in <module>()
----> 1 from my_modules import module1
ModuleNotFoundError: No module named 'my_modules'
---------------------------------------------------------------------------
NOTE: If your import is failing due to a missing package, you can
manually install dependencies using either !pip or !apt.
To view examples of installing some common dependencies, click the
"Open Examples" button below.
---------------------------------------------------------------------------
- 冒頭にも書いた通り、ノートブックを開いた後にGoogle Drive上でファイルを追加・移動したり、ファイルの内容を変更してもすぐには認識されません。
これはGoogle DriveというよりもGoogle Colaboratoryやその元となったJupyter Notebookの仕様で、一度importしたモジュールは再度importを行ってもファイルから読み込むことはせず、メモリ上のプログラムをそのまま再利用します。
そのため、モジュールの内容を書き換えた場合、明示的にリロードする必要があります。
import importlib
importlib.reload(module1)
私はこれに気づかず、importのエラーを解消するのに数時間を無駄にしました・・・。Jupyter Notebookに不慣れな方は、同じ轍を踏まないようにご注意ください。
【2020/12/25追記】
モジュールをインポートできない時はランタイムの再起動も試してみるといいと思います。
参考: マウントして、パスも通しているのにGoogle Colaboratoryにモジュールをインポートできない😭👉ランタイムを再起動しましょう)