Skip to content

Python 絶対インポートと相対インポート

Pythonのインポートには 絶対インポート相対インポート の2種類がある。用途に応じた使い分けが保守性に直結する。

絶対インポート

プロジェクトのルート(sys.path に含まれるディレクトリ)からのフルパスを指定する。

# main.py から utils.py の関数を呼ぶ
from my_app.utils import function_a

# main.py から models/user.py のクラスを呼ぶ
from my_app.models.user import User
  • どこから呼んでも同じパスで参照できる
  • PEP 8 インポートの記述規則 で公式に推奨されている
  • IDEの補完・静的解析ツールとの相性が良い

相対インポート

現在のファイルの位置を基準にドット(.)で指定する。パッケージ内のモジュール間連携で便利。

# 同じパッケージ内の __init__.py を参照
from . import something

# 同階層の別モジュールを参照
from .utils import function_a

# 親パッケージのモジュールを参照
from ..utils import function_a

相対インポートの注意点

相対インポートを含むファイルを直接 python user.py のように実行すると ImportError が発生する。

# 誤った実行方法(ImportError になる)
python src/my_app/models/user.py

# 正しい実行方法(-m オプションでパッケージとして実行)
python -m my_app.models.user

理由: 直接実行するとスクリプトとして動作し、親パッケージが不明になるため相対インポートが解決できない。

比較まとめ

項目 絶対インポート 相対インポート
記法 from my_app.utils import f from ..utils import f
推奨度 PEP 8 公式推奨 パッケージ内のみ可
リファクタリング パッケージ名変更で全修正必要 相対位置が変わらなければ影響なし
直接実行 可能 -m オプション必須

関連

引用元: NotebookLM