0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonでサブディレクトリのモジュールをインポートする方法まとめ

Posted at

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です。


✅ 前提条件チェック

  1. ディレクトリ構成

    your_project/
    ├── test.py
    └── lib/
        ├── __init__.py    ← 必須(空でOK)
        └── func.py
    
  2. 関数定義(lib/func.py)

    def func():
        print("Hello from func!")
    
  3. test.py の書き方

    import lib.func
    
    lib.func.func()
    

🔑 解説:なぜ __init__.py が必要?

  • __init__.pylib/ に置くことで、Python は lib を「パッケージ」と認識します。
  • これがないと import lib.funcModuleNotFoundError になる場合があります。

📝 注意点

  • libtest.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.funcfrom 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.ipynbColab 上で動かす場合は、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:

もちろんです!ブログ用に、検索性・実用性・親しみやすさのバランスを取ったタイトル案をいくつかご提案しますね。用途や読者層に合わせて選べるよう、少しタイプの違うものを混ぜています。


💡 シンプル実用型(検索しやすい)

  1. 「Pythonでサブディレクトリのモジュールをインポートする方法まとめ」
  2. 「Jupyter Notebookから別ディレクトリのPython関数をインポートするには?」
  3. 「importエラーを回避!Pythonでフォルダをまたいで関数を呼ぶ方法」
  4. 「Pythonプロジェクト構成とモジュールのインポート完全ガイド」
  5. 「Google Colabで自作モジュールをインポートする方法【Drive対応】」

🧠 学習ノート風(初学者〜中級者向け)

  1. 「Pythonのimportでつまずかない!自作関数の呼び出し方あれこれ」
  2. 「lib.func.funcをlib.funcで呼びたいんだけど?そんなときのimport設定」
  3. 「Pythonのパッケージ構成とsys.pathの扱い、ちゃんと理解してみた」
  4. 「Jupyter Notebookからlib/func.pyの関数を呼ぶまでの道のり」

📝 ストーリー風(経験談ぽい)

  1. 「test.pyからlib/func.pyをスマートに呼びたい!Python importの工夫メモ」
  2. 「ColabからGoogle Drive内の関数を呼び出すまでにやったこと」
  3. 「自作関数が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.funclibが未登録) libsys.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:

どういたしまして!お役に立ててとっても嬉しいです😊
ブログ執筆、応援しています!またいつでも質問やご相談があれば気軽に声をかけてくださいね。

今日も素敵な一日をお過ごしください☕✨

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?