その他

【Python】個人的推奨ディレクトリ構成【ModuleNotFoundError】

その他
この記事は約3分で読めます。

インプルの井上です。本日はPython開発における個人的推奨ディレクトリ構成をご紹介いたします。

勿論プロジェクト毎に推奨構成は変わってきますが参考になる方はご活用ください。

尚今回は環境のセットアップについては記載しません、ご了承ください。

環境

OSmacOS Ventura 13.4.1(c)
Python3.9.7
VSCode1.83.1

ディレクトリ構成

プロジェクト名/

├─ __init__.py
├─ main.py (メインの実行ファイル)

├─ パッケージA/
│ ├─ __init__.py
│ ├─ モジュール1.py
│ └─ モジュール2.py

├─ パッケージB/
│ ├─ __init__.py
│ ├─ モジュール3.py
│ └─ モジュール4.py

└─ setup.py (パッケージング用スクリプト)

  • __init__.pyファイルにより、ディレクトリがPythonパッケージであることを示されています。
  • main.pyは、プロジェクトのエントリーポイントであり、実行ファイルです。
  • 各パッケージディレクトリには、関連するモジュールが含まれています。
  • setup.pyは、Pythonパッケージのインストールと配布のためのスクリプトです。

サンプルコード

main.py

from パッケージA import モジュール1, モジュール2
from パッケージB import モジュール3, モジュール4

if __name__ == "__main__":
    モジュール1.関数X()
    モジュール2.関数Y()
    モジュール3.関数Z()
    モジュール4.関数α()

パッケージA/モジュール1

def 関数X():
    print("モジュール1の関数Xが実行されました。")

パッケージA/モジュール2

def 関数Y():
    print("モジュール2の関数Yが実行されました。")

パッケージB/モジュール3

def 関数3():
    print("モジュール3の関数Zが実行されました。")

パッケージB/モジュール4

def 関数4():
    print("モジュール4の関数αが実行されました。")

setup.py

from setuptools import setup, find_packages

setup(
    name="mypackage",
    packages=find_packages(),
    install_requires=[# 依存パッケージを記述],
)

解説

・上記ディレクトリ構成はオブジェクト指向的にパッケージを配置しているため、

モジュールやパッケージの使いまわしができ、他の人への共有もしやすくなります。

・main.pyをルートディレクトリ(プロジェクト名/)直下に配置することで各パッケージへのパスも

通り、Python実装時に頻発するModuleNotFoundErrorの可能性も潰すことができます。

・メインロジックを実装した後、ユニットテストを実装すると思いますが、上記ディレクトリ構成

と同じくルートディレクトリ直下にtestsディレクトリを作成しテストコードファイルを実装すると

unittestやpytestなどのテスト用ライブラリを使用する時にも余計なエラーが発生せず

スムーズにテストすることができます。

最後に

今回ご紹介したディレクトリ構成は私自身は一般的なアプリケーション開発にとても向いている

と思っております。実行ファイル(main.py)をディレクトリ内に格納し各ライブラリをその配下に

配置する方法も一般的ですが、今回はライブラリを他の実行ファイルで使い回す状況を考慮し、

上記の構成といたしました。

Python開発の1歩目を踏み出す皆様の参考となれば幸いです。