WindowsでPythonのsys.path.appendとos.pardirで相対パス設定

Pythonでは、モジュールパスを設定することで、別のディレクトリにあるモジュールをインポートすることができます。

sys.path.appendを使うことで、モジュールの検索パスに新しいパスを追加することができます。

Pythonのモジュールパスについて

Pythonは、モジュールをインポートするときに、sys.pathというリストを検索し、モジュールがあるディレクトリを探します。

import sys
print(sys.path)

実行結果:

['C:\\Python36\\Lib\\idlelib', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36', 'C:\\Python36\\lib\\site-packages']

上記の結果は、Pythonがモジュールを探すディレクトリのリストです。

Windows環境でのPythonのsys.path.appendの使い方

Windows環境で、sys.path.appendを使って、モジュールの検索パスに新しいパスを追加する方法を紹介します。

例えば、プロジェクトのルートディレクトリにあるutilsディレクトリにあるモジュールをインポートしたい場合、以下のようにsys.path.appendを使ってutilsディレクトリを追加します。

import sys
sys.path.append('utils')
import mymodule

相対パスを設定する方法

sys.path.appendを使って、相対パスを設定する方法を紹介します。

相対パスを設定する場合は、osモジュールのos.pardirを使います。

例えば、プロジェクトのルートディレクトリにあるutilsディレクトリにあるモジュールをインポートする場合、以下のようにos.pardirを使って相対パスを設定します。

import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, 'utils'))
import mymodule

上記の例では、__file__は現在のスクリプトのファイル名を含むパスであり、os.path.dirname(__file__)は現在のスクリプトのディレクトリ名を返します。

os.path.joinは、引数を結合して新しいパスを作成します。

os.pardirを用いた相対パスの設定

os.pardirを用いて相対パスを設定する方法は、プロジェクトのルートディレクトリからの相対パスを指定する場合に便利です。

例えば、プロジェクトのルートディレクトリにあるutilsディレクトリにあるモジュールをインポートする場合、以下のようにos.pardirを使って相対パスを設定します。

import sys, os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, 'utils')))
import mymodule

上記の例では、os.path.abspathを使って、相対パスを絶対パスに変換しています。

sys.path.appendとos.pardirを組み合わせた使用例

sys.path.appendとos.pardirを組み合わせた使用例を紹介します。

例えば、プロジェクトのルートディレクトリにあるscriptsディレクトリにあるmyscript.pyから、utilsディレクトリにあるmymodule.pyをインポートする場合、以下のように設定します。

import sys, os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, 'utils')))
import mymodule

注意点とトラブルシューティング

sys.path.appendを使ってモジュールの検索パスを追加する場合は、以下のような注意点があります。

  • 相対パスを指定する場合は、プロジェクトのルートディレクトリからの相対パスを指定することが推奨されています。
  • sys.path.appendで追加したパスは、Pythonインタープリタが終了するときにクリアされます。
  • import文を実行する前にsys.path.appendを実行する必要があります。
  • モジュール名が重複している場合は、最初に見つかったモジュールが使われます。
  • モジュールの検索パスに追加するパスは、読み取り可能である必要があります。
  • パスを追加すると、他のモジュールをインポートする際に、モジュール名の解決が変わることがあります。

まとめ

Pythonのsys.path.appendとos.pardirを使って、モジュールの検索パスに新しいパスを追加する方法を紹介しました。

相対パスを指定する場合は、os.pardirを使うことで、プロジェクトのルートディレクトリからの相対パスを指定することが推奨されています。

注意点とトラブルシューティングについても紹介しました。