【Python】相対パスでモジュールをimportする

Pythonプログラミングを学び始めたばかりの方へ、この記事では「相対パスを使ったモジュールのimport方法」について解説します。

相対パスを使うことで、プロジェクト内の異なるファイルやディレクトリから簡単にコードを再利用できるようになります。

具体的な例を交えながら、基本的な使い方から実際のプロジェクトでの応用までをわかりやすく説明しますので、ぜひ参考にしてください。

目次から探す

相対パスでのimport方法

Pythonでは、モジュールをimportする際に絶対パスと相対パスの両方を使用することができます。

絶対パスはプロジェクトのルートディレクトリからの完全なパスを指定する方法ですが、相対パスは現在のファイルの位置を基準にしてパスを指定する方法です。

相対パスを使用することで、コードの移動やプロジェクトの構造変更に対して柔軟に対応することができます。

単一ドット(.)と二重ドット(..)の意味

相対パスでのimportを理解するためには、単一ドット(.)と二重ドット(..)の意味を知っておく必要があります。

  • .(単一ドット):現在のディレクトリを指します。
  • ..(二重ドット):親ディレクトリを指します。

これらを使うことで、現在のファイルの位置を基準にして他のモジュールをimportすることができます。

相対パスを使ったimportの基本例

相対パスを使ったimportの基本的な例をいくつか見てみましょう。

同じディレクトリ内のモジュールをimport

まず、同じディレクトリ内にあるモジュールをimportする方法です。

例えば、以下のようなディレクトリ構成を考えます。

project/
├── module_a.py
└── module_b.py

module_a.pyからmodule_b.pyをimportする場合、以下のように書きます。

# module_a.py
from . import module_b
# module_b.pyの関数やクラスを使用
module_b.some_function()

このように、単一ドット(.)を使って同じディレクトリ内のモジュールをimportすることができます。

親ディレクトリのモジュールをimport

次に、親ディレクトリにあるモジュールをimportする方法です。

以下のようなディレクトリ構成を考えます。

project/
├── module_a.py
└── subdir/
    └── module_b.py

subdir/module_b.pyからmodule_a.pyをimportする場合、以下のように書きます。

# subdir/module_b.py
from .. import module_a
# module_a.pyの関数やクラスを使用
module_a.some_function()

このように、二重ドット(..)を使って親ディレクトリのモジュールをimportすることができます。

相対パスを使ったimportは、プロジェクトのディレクトリ構造に依存するため、ディレクトリ構成をしっかりと把握しておくことが重要です。

次のセクションでは、実際のプロジェクトでの使用例を見ていきましょう。

実際のプロジェクトでの使用例

ディレクトリ構成の例

相対パスを使ってモジュールをimportする際には、プロジェクトのディレクトリ構成が非常に重要です。

以下に、典型的なPythonプロジェクトのディレクトリ構成の例を示します。

my_project/
├── main.py
├── module_a/
│   ├── __init__.py
│   ├── submodule_a1.py
│   └── submodule_a2.py
└── module_b/
    ├── __init__.py
    └── submodule_b1.py

この構成では、my_projectディレクトリがプロジェクトのルートディレクトリであり、その中にmain.pyというメインスクリプトと、module_aおよびmodule_bという2つのサブディレクトリがあります。

各サブディレクトリにはさらに複数のモジュールが含まれています。

相対パスを使ったimportの具体例

サブディレクトリからのimport

まず、module_aディレクトリ内のsubmodule_a1.pyから同じディレクトリ内のsubmodule_a2.pyを相対パスでimportする例を見てみましょう。

submodule_a1.pyの内容は以下の通りです。

# submodule_a1.py
from .submodule_a2 import some_function
def another_function():
    some_function()
    print("This is another function in submodule_a1")

この例では、from .submodule_a2 import some_functionという行で、同じディレクトリ内のsubmodule_a2.pyからsome_functionをimportしています。

単一ドット(.)は現在のディレクトリを意味します。

複数階層のディレクトリからのimport

次に、module_bディレクトリ内のsubmodule_b1.pyからmodule_aディレクトリ内のsubmodule_a1.pyを相対パスでimportする例を見てみましょう。

submodule_b1.pyの内容は以下の通りです。

# submodule_b1.py
from ..module_a.submodule_a1 import another_function
def yet_another_function():
    another_function()
    print("This is yet another function in submodule_b1")

この例では、from ..module_a.submodule_a1 import another_functionという行で、親ディレクトリのmodule_aディレクトリ内のsubmodule_a1.pyからanother_functionをimportしています。

二重ドット(..)は親ディレクトリを意味します。

実行結果の例

それでは、main.pyからこれらの関数を呼び出してみましょう。

main.pyの内容は以下の通りです。

# main.py
from module_b.submodule_b1 import yet_another_function
if __name__ == "__main__":
    yet_another_function()

このスクリプトを実行すると、以下のような出力が得られます。

This is another function in submodule_a1
This is yet another function in submodule_b1

このように、相対パスを使ってモジュールをimportすることで、プロジェクト内の異なるディレクトリにあるモジュール間で簡単にコードを再利用することができます。

目次から探す