user:
test.py という実行ファイルがあります。同じディレクトリに lib/ というサブディレクトリがあり、その中に func.py というファイルがあります。func.py の中には def func という形で関数 func が記述してあります。test.py の中でこれを呼び出す時、 import lib.func.func という形ではなく、 import lib.func という形で呼び出したいのですが、いい方法はありませんか?
assistant:
はい、可能です。lib/func.py
に定義された func()
関数を test.py
から import lib.func
の形式でインポートし、lib.func.func()
のように呼び出すには、以下の2点を確認すればOKです。
✅ 前提条件チェック
-
ディレクトリ構成
your_project/ ├── test.py └── lib/ ├── __init__.py ← 必須(空でOK) └── func.py
-
関数定義(lib/func.py)
def func(): print("Hello from func!")
-
test.py
の書き方import lib.func lib.func.func()
🔑 解説:なぜ __init__.py
が必要?
-
__init__.py
をlib/
に置くことで、Python はlib
を「パッケージ」と認識します。 - これがないと
import lib.func
はModuleNotFoundError
になる場合があります。
📝 注意点
-
lib
がtest.py
と同じ階層にある必要があります。 - Python の実行時カレントディレクトリ(
test.py
のある場所)にlib/
が相対パスで見える必要があります。
🚀 さらに便利に:関数を直接 import したい場合
from lib.func import func
func()
こうすれば lib.func.func()
のように毎回パスを書く必要がなくなります。ただし、今回の質問では import lib.func
形式を使いたい ということなので、上記は参考程度に。
必要に応じて、__init__.py
の中に from .func import func
を書けば、import lib
だけで lib.func()
のように使うことも可能です(さらに一段上のインポート)――もしご希望であればそれも説明します。
user:
Google Drive に置いて Colaboratory 上で使うなら import drive.MyDrive.lib as lib のように使えますね。
assistant:
おっしゃる通りです!Colaboratory(Google Colab)上で Google Drive にあるモジュールを使う場合、import drive.MyDrive.lib
のようなインポートができそうに見えますが、実はPythonの標準的なインポート構文ではそれは正しくありません。ただし、似たようなことをする方法はあります。以下にその正しいやり方を整理して説明します。
✅ 正しいやり方:Google Drive のモジュールをインポート
1. Google Drive をマウントする
from google.colab import drive
drive.mount('/content/drive')
2. モジュールを配置する
たとえば、Google Drive 内の以下の構成を想定します:
My Drive/
└── myproject/
├── lib/
│ ├── __init__.py
│ └── func.py
└── test.ipynb(= Colab ノートブック)
3. Python パスに追加する
Colab ノートブックで次のようにパスを追加します:
import sys
sys.path.append('/content/drive/MyDrive/myproject')
4. モジュールをインポートする
import lib.func
lib.func.func()
❌ なぜ import drive.MyDrive.lib
は動かないのか?
Python の import
文は ファイルシステム上のパスではなく、モジュールパス(パッケージ構造) に基づいています。そのため、
import drive.MyDrive.lib
のように書いても、drive/
や MyDrive/
が Python モジュール(かつ sys.path
に含まれている)でなければ認識されません。
🧠 応用:トップレベルをスッキリさせたいとき
- Colab ノートブックのある場所と
lib/
を同じ階層に配置して、 -
sys.path.append('/content/drive/MyDrive/myproject')
を使えば、
import lib.func
や from lib import func
のようにスッキリ書けます。
💡まとめ
やりたいこと | 方法 |
---|---|
Google Drive のコードをインポート |
drive.mount() + sys.path.append()
|
import lib.func と書きたい |
lib/ をパッケージ化し、__init__.py を置く |
import drive.MyDrive.lib は使えるか |
✕(Python の import 文では不可) |
必要であれば、func.py
の中身や、__init__.py
を使ったパッケージ化の工夫についてもサンプルコード付きで解説できます。お気軽にどうぞ!
user:
ありがとうございます。次のような構成になってる時、notebook1.ipynbからfuncを呼び出すにはどうすれば良いですか?
your_project/
└── notebook/
└── notebook1.ipynb
└── lib/
├── init.py
└── func.py
assistant:
ご質問ありがとうございます。以下の構成において:
your_project/
├── notebook/
│ └── notebook1.ipynb
└── lib/
├── __init__.py
└── func.py
notebook1.ipynb
から lib/func.py
の中の関数 func()
を呼び出すためには、Python に your_project/
をモジュール探索パスに含めさせる必要があります。
✅ 方法:sys.path
にプロジェクトルートを追加
1. notebook1.ipynb
に以下を記述:
import sys
import os
# notebook1.ipynb から見て1つ上のディレクトリ(your_project/)をパスに追加
sys.path.append(os.path.abspath(".."))
# func をインポート
import lib.func
# 関数を呼び出し
lib.func.func()
✅ 代替案:関数だけ直接インポートしたい場合
from lib.func import func
func()
✅ 補足:__init__.py
の役割
-
lib/
に__init__.py
があることで、Python はlib
を「パッケージ」として認識します。 - 中身は空でOKです(必要なら初期化コードを書いても可)。
✅ 注意点
-
notebook1.ipynb
を Colab 上で動かす場合は、Google Drive のパス調整が別途必要です(前回の回答参照)。 - VS Code やローカル環境であれば、このままで動作します。
🧪 例:lib/func.py の中身がこうなっていると仮定
# lib/func.py
def func():
print("Hello from lib.func!")
このとき、notebook1.ipynb
は以下のように書けばOK:
import sys
import os
sys.path.append(os.path.abspath(".."))
from lib.func import func
func()
ご希望に応じて、Jupyter Notebook のカーネル起動時に自動でパスを通す方法(ipython startup script
)などもご紹介できます。必要であればお知らせください。
user:
ありがとうございます!これで大丈夫です。ここまでの内容をブログに記録したいので、タイトル案をいくつか考えていただけますか?
assistant:
もちろんです!ブログ用に、検索性・実用性・親しみやすさのバランスを取ったタイトル案をいくつかご提案しますね。用途や読者層に合わせて選べるよう、少しタイプの違うものを混ぜています。
💡 シンプル実用型(検索しやすい)
- 「Pythonでサブディレクトリのモジュールをインポートする方法まとめ」
- 「Jupyter Notebookから別ディレクトリのPython関数をインポートするには?」
- 「importエラーを回避!Pythonでフォルダをまたいで関数を呼ぶ方法」
- 「Pythonプロジェクト構成とモジュールのインポート完全ガイド」
- 「Google Colabで自作モジュールをインポートする方法【Drive対応】」
🧠 学習ノート風(初学者〜中級者向け)
- 「Pythonのimportでつまずかない!自作関数の呼び出し方あれこれ」
- 「lib.func.funcをlib.funcで呼びたいんだけど?そんなときのimport設定」
- 「Pythonのパッケージ構成とsys.pathの扱い、ちゃんと理解してみた」
- 「Jupyter Notebookからlib/func.pyの関数を呼ぶまでの道のり」
📝 ストーリー風(経験談ぽい)
- 「test.pyからlib/func.pyをスマートに呼びたい!Python importの工夫メモ」
- 「ColabからGoogle Drive内の関数を呼び出すまでにやったこと」
- 「自作関数がimportできない!?原因と対処法まとめ」
ご希望のテイスト(技術ドリブン・読みやすさ重視・初心者向けなど)に合わせて調整できます。気に入った案があればお知らせください。それをベースに本文構成までお手伝いすることもできますよ。
user:
「Pythonでサブディレクトリのモジュールをインポートする方法まとめ」でいきたいと思います。このタイトルに沿って、今回の内容を詳しくまとめてください。
assistant:
素晴らしい選択です!それでは、以下に 「Pythonでサブディレクトリのモジュールをインポートする方法まとめ」 というタイトルにふさわしい、実用的で丁寧な技術記事を構成・執筆します。
Pythonでサブディレクトリのモジュールをインポートする方法まとめ
Pythonプロジェクトを構築していくと、コードを整理するためにサブディレクトリに関数やクラスをまとめたくなることがあります。
ですが、その際に「import
がうまく動かない…」「パスの指定でエラーが出る」といった悩みに直面する方も多いはず。
本記事では、以下の構成を例に取りながら、サブディレクトリのモジュール(例:lib/func.py
)を、別のファイル(例:notebook/notebook1.ipynb
)から呼び出す方法を、ローカル環境・Colab環境の両方に対応して解説します。
📁 例として使うディレクトリ構成
your_project/
├── notebook/
│ └── notebook1.ipynb ← このノートブックから呼び出したい
└── lib/
├── __init__.py ← パッケージとして認識させるために必要(中身は空でOK)
└── func.py ← 呼び出したい関数 func が定義されている
✅ 目標:lib/func.py
の関数 func()
を notebook1.ipynb
から使いたい!
方法①:ローカル環境での標準的な手順
🔧 1. lib/
を Python のモジュールパスに加える
Python は「現在の作業ディレクトリ」や「sys.path
に含まれるパス」の中からモジュールを探します。
ノートブック内で次のように記述します:
import sys
import os
# 1つ上の階層(your_project/)をパスに追加
sys.path.append(os.path.abspath(".."))
🧪 2. モジュールをインポートして関数を呼び出す
# 方法A:モジュール全体をインポート
import lib.func
lib.func.func()
# 方法B:関数だけを直接インポート
from lib.func import func
func()
このようにすれば、サブディレクトリ lib/
にある関数も問題なく使えます。
方法②:Google Colaboratory(Colab)で Google Drive 上のモジュールを使いたい場合
📌 事前準備:Google Drive をマウントする
from google.colab import drive
drive.mount('/content/drive')
🗂 例:Google Drive 上の構成
My Drive/
└── your_project/
├── lib/
│ ├── __init__.py
│ └── func.py
└── notebook/
└── notebook1.ipynb
➕ sys.path にプロジェクトルートを追加
import sys
sys.path.append('/content/drive/MyDrive/your_project')
✅ モジュールを使う
from lib.func import func
func()
✅ 補足:なぜ __init__.py
が必要なの?
Python は、フォルダを「パッケージ」として認識するために、その中に __init__.py
があることを必要とします。
このファイルが存在しないと、import lib.func
のような構文でエラーが出る可能性があります。
- 内容は空でOK
-
from .func import func
などを書くことで、さらにインポートのエイリアスも設定可能です
❌ よくある間違い
書き方 | 問題点 |
---|---|
import drive.MyDrive.lib |
ファイルシステムのパスは import に使えない |
import ../lib/func.py |
相対パスで .py ファイルを直接指定するのはNG |
import lib.func (lib が未登録) |
lib が sys.path にないため ModuleNotFoundError |
✅ まとめ
環境 | 手順 |
---|---|
ローカル環境 |
sys.path.append(os.path.abspath("..")) を使ってルートを追加 |
Google Colab |
drive.mount() + sys.path.append('/content/drive/MyDrive/xxx')
|
どちらも共通 |
__init__.py をサブディレクトリに置いてパッケージ認識させる |
📌 おまけ:パッケージ構成を保ったまま再利用性を高めたいときは?
以下のように、自作モジュールを pip インストール可能な形にまとめることも可能です(setup.py
を使って構築)。
それはまた別記事にて!
✍️ おわりに
Python のプロジェクトを少し本格的に組み始めると、モジュールのインポートでつまずくことが多いです。
今回紹介した方法を知っておくだけで、スムーズに関数やクラスを再利用できるようになります。
ぜひ、あなたの開発に役立ててください!
ご希望があれば、このまま Markdown ファイル化・ブログへの投稿支援・画像/図解の追加も可能です。必要に応じてお申し付けくださいね!
user:
ありがとうございました!
assistant:
どういたしまして!お役に立ててとっても嬉しいです😊
ブログ執筆、応援しています!またいつでも質問やご相談があれば気軽に声をかけてくださいね。
今日も素敵な一日をお過ごしください☕✨