Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
89
Help us understand the problem. What is going on with this article?
@Kunikata

Google ColaboratoryでGoogle Drive上の.pyファイルをインポート

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 追記:左ペインを開いて、「ファイル」 → 「ドライブをマウント」を選択すると、同様のコードがセルに展開されるようになっていたようです)

ss.png

実行すると認証用の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にモジュールをインポートできない😭👉ランタイムを再起動しましょう)

89
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
89
Help us understand the problem. What is going on with this article?