質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

【Python】Google Colaboratoryにおける自作モジュールのインポート

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 1,150

Palude_Lunga

score 4

実現したいこと

Google Colabratoryの環境でPythonの学習をしております.
コードが長くなり,可読性が低下してきたことから,ファイルをモジュール毎に分割して管理したいと考えております.そこで今回は,「Google Colabratoryのノートブック上で別の.pyファイルをインポートし,実行する」ということを実現したいと考えております.

調べればヒットしない内容ではないのですが,同一事例を参考にして,同様な手順で行っても,何故か上手く行かず,困り果てている状況で,皆様のお力をお借りしたいと思った次第です.

該当のソースコード

ファイルは以下の2つです.

Module1.py
print('Hello World!')
Main.ipynb
# Google Driveのマウント--------------
from google.colab import drive
drive.mount('/content/drive')

# 作業ディレクトリの移動と確認------------------------
import os
os.chdir('/content/drive/My Drive/Colab_Test/my_projects/')
!ls

# 他ファイルのインポート・リロード------------------------
import Module1
import imp
imp.reload(Module1)
ディレクトリ構成
My Drive/
    └ Colab_Test/
         └ my_projects/
               ├ Main.ipynb
               └ Module1.py

試したこと

上記のMain.ipynbから同一ディレクトリにあるModule1.pyをインポートして使用する,ということを試しました.

Google Driveのマウント,ディレクトリの移動も問題なく,!lsコマンドの結果として,

Main.ipynb  Module1.py    __pycache__


が得られているので,ここまでは問題ないと考えています.

しかしながら,import Module1を実行しても,Hello World!が返ってきません.

Google Colaboratory特有のキャッシュやランタイムの問題も考えられますので,

import imp
imp.reload(Module1)


にて,インポートしたModule1.pyをリロードしても結果は同じでした.

参考にしたこと

下記の2つの記事を参考にさせていただきました.

  1. Google ColaboratoryでGoogle Drive上の.pyファイルをインポート
  2. Google ColaboratoryでPythonファイルを実行する

発生している問題・エラーメッセージ

エラーメッセージは特にありません.

上記の記事と同様な方法で試したつもりですが,期待する結果が得られず,エラーメッセージも特に出ないため,何が原因なのか見当がつかない状況です.

この現象について,お分かりの方がいらっしゃいましたら,ご助言をいただければ幸いです.
何卒よろしくお願いいたします.

補足情報(FW/ツールのバージョンなど)

  • 開発環境:Google Colaboratory
  • バージョン:python3.6.9
  • ランタイムの設定:ハードウェアアクセラレータNone
  • OS:Ubuntu 18.04.3 LTS
  • CPU:Intel(R) Xeon(R) CPU @ 2.20GHz
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

check解決した方法

+2

皆様,お忙しい中,ご回答ありがとうございました.解決しました.
基本中の基本のようなことが原因で,非常にお恥ずかしい限りですが,共有させていただきます.

.pyファイルの作成に問題がありました.

私が知る限り,Colaboratoryには.py形式で保存する機能がありませんので,Module1.pyを作成する際に,Colaboratory上でノートブック形式でModule1.ipynbを作成した後に,下図のように画面左上のファイル名の拡張子を直接編集して,.pyファイルを作成しておりました.本当にごめんなさい.
イメージ説明

拡張子をむやみにいじることはご法度であることは知っておりましたが,この方法で作成した.pyファイルでもColaboratoryで直接実行する分には問題なく動作しておりましたので,Renameする際に,内部的に良きにやってくれているものと勘違いしていました(←ど素人).

しかしながら,多くの皆様の環境では問題なく実行できて,さらにはプログラミングに長けている皆様でも解決できないということは,より根本的な部分が原因である可能性が高いと思い始めていたところ,ふと上記のような拡張子変更という荒業で.pyファイルを作っていたことを思い出し,Colaboratoryのファイルメニュー下部にある「.pyをダウンロード」から正規の手続きで.pyファイルを作成し,それをアップロードした上で,Main.ipynbを実行したところ,正常に「Hello_World!!」を出力することができました.

このような初歩的なことでお騒がせしてしまい,大変申し訳ありませんでした.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/13 15:54

    なるほど、そう言うことでしたか。
    とりあえず解決できて良かったです。

    キャンセル

  • 2020/05/13 16:00

    magichan様,この度はこのような初歩的なことでご迷惑をおかけして申し訳ありませんでした.お時間を割いていただき,ありがとうございました!初めての質問の投稿で,少し不安でしたが,ご回答をいただけて,とても心強く感じました.本当にありがとうございました!

    キャンセル

+2

素直に setup.py を書いてパッケージングするのが最短の気がします。

フォルダ構成

My Drive/
    └ Colab_Test/
         └ my_projects/
               ├ Main.ipynb
               └ module1
                   ├ setup.py
                   └ module1
                       └ __init__.py

setup.py

from setuptools import setup

setup(name='module1',
      version='0.1',
      description='My module #1',
      url='',
      author='magichan',
      author_email='magichan.lab@gmail.com',
      license='MIT',
      packages=['module1'],
      zip_safe=False)

init.py

print('Hello World!!')

Main.ipynb

# Google Driveのマウント--------------
from google.colab import drive
drive.mount('/content/drive')

# 自作モジュールのインストール-----------------------
import os
os.chdir('/content/drive/My Drive/Colab_Test/my_projects/module1/')
!ls
# module1  setup.py

!pip install module1
# Collecting module1
#   Downloading # https://files.pythonhosted.org/packages/8e/01/**********/module1-0.1.0-py2.py3-none-any.whl
# Installing collected packages: module1
Successfully installed module1-0.1.0

# 他ファイルのインポート・リロード------------------------
os.chdir('/content/drive/My Drive/Colab_Test/my_projects/')

import module1
# Hello World!!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/09 14:06

    magichan様,返信ありがとうございます.

    >import module1
    >で Hello Worlds!! が出ると思うのですが、出ませんか?

    すみません,コードの記述は誤っていないことを確認したのですが,Hello Worlds!! は出てきません.

    その後,何が原因なのか色々探ってみて,わざと__init__.pyの中身をエラーが出るように書き換えて,実行してみました.__init__.pyを直接走らせた場合は,当然エラーを返しますが,パッケージとして他ファイルから呼び出した際には,Hello Worlds!! もエラーも返さないことが分かりました.やはりGoogle Drive内の.pyファイルについては「認識はできるのに,実行はできない」現象のようです.

    ちなみに.pyファイルではない他のテキストファイル等の読み取りは問題なくできることは確認しております.また,別のGoogleアカウントでも試しましたが,同様の現象でした.

    キャンセル

  • 2020/05/09 17:34

    自分の回答を見直してみましたが、1箇所まちがいをみつけました。
    大変・大変申し訳ありません。。

    install の方法ですが、
    !pip install module1
    ではなくて
    !pip install .
    ですね。(なんでこんな間違いしたんだろ?)

    一応念の為、「ランタイム」→「ランタイムを出荷時設定にリセット」をした後に動作確認してみてください。(その場合再マウントが必要となりますが。)

    パッケージの __init__.py は 1回目の import 時しか動作しませんので、再度動作を確認する際は
    import imp
    imp.reload(module1)
    してください。

    キャンセル

  • 2020/05/10 07:04

    magichan様,ご訂正ありがとうございます.
    お手数をおかけして申し訳ありません.

    ランタイムをリセットした上で
    !pip install module1
     ↓
    !pip install .
    に書き換えて試したところ,
    ERROR: Files/directories not found in /tmp/pip-req-build-acglqgco/pip-egg-info
    というエラーが返ってきてしまいました...
    すんなり行かず本当に申し訳ありません!

    キャンセル

+1

エラーメッセージが出ていないということはimport Module1は成功しているということです。
Module1.__file__でModule1の場所を確認してみてください。
可能性として同名ファイルがパスのどこかにあり、別のファイルが読み込まれていないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/12 16:19

    meg_様,貴重なご回答ありがとうございます!

    ご提案の通り,Module1.__file__を実行したとことろ,

    '/content/drive/My Drive/Colab_Test/my_projects/Module1.py'

    が得られました.
    また,ドライブ上には当該フォルダ,ファイルのみしか存在しないので,同名の別ファイルが読み込まれている可能性は低いかと思います.

    >エラーメッセージが出ていないということはimport Module1は成功しているということです。
    このアドバイスに関連してなのですが,Module1.pyの記述を

    print('Hello World!'

    のように,最後のカッコを除去して,わざとエラーが出るようにして実行してみますと,
    Module1.pyを直接走らせた場合には,当然エラーを出しますが,Main.ipynbから呼び出すと,エラーを出さない(Hello World!も出ない)という現象がおきました.

    このことから,Module1.pyの中身が正常でも不正でも同様の結果=「そもそも呼び出せていない」ということかなぁ...と推測します.

    キャンセル

  • 2020/05/12 17:35

    私も試したところ問題なく画面出力されました。
    ランタイムを再起動して試しても駄目ですか?

    キャンセル

  • 2020/05/13 05:36

    ランタイムの再起動,または工場出荷時へのリセットいずれも試してみましたが,だめでした...

    キャンセル

  • 2020/05/13 09:45

    そうですか。出るはずのエラーが出なかったのは同名モジュールのimportをしたため、実際にはimportされなかったと思ったのですが。再起動しても駄目でしたか。謎ですねぇ。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る