django app ディレクトリのすぐ下にある「fixtures」ディレクトリに配置した画像ファイルにアクセスする必要がある単体テストを作成しています。相対パスを使用してテストでこの画像ファイルを開きたいのですが、django アプリの絶対パスを取得する必要があります。django アプリの絶対パスを取得する方法はありますか?
6 に答える
Python モジュール (Django アプリを含む)には、ファイル システム上のファイル__file__
の場所を示す属性があるため、__init__.py
import appname
pth = os.path.dirname(appname.__file__)
あなたがしたいことをするべきです。
通常の状況ではos.path.absname(appname.__path__[0])
、 ですが、奇妙な方法でファイルをインポートしたい場合、アプリがそれを変更する可能性があります。
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
(ただし、私は常に で行いsettings.py
ます -- 絶対パスにする必要があるさまざまな設定を簡単にします。)
したがって、受け入れられた答えは通常うまくいきます。ただし、
- 複数のパスを持つ名前空間パッケージ、または
- 設定でパスを明示的に設定するアプリ、
__file__
意図したパスがモジュールの属性と一致しない場合があります。
Django (1.7+) はAppConfig.path
属性を提供します。これは、単純なケースでもより明確であり、これらのエッジケースもカバーしていると思います。
アプリケーションのドキュメントには、AppConfig オブジェクトを取得する方法が記載されています。したがって、AppConfig を取得してパスを出力するには、次のようにします。
from django.apps import apps
print(apps.get_app_config('app_label').path)
編集:get_app_config
ドットを削除するために使用する方法の例を変更しましたが、これは混乱しているようです。参照用のドキュメントは次のとおりです。
通常、プロジェクト ルートを参照できるように、これを settings.py ファイルに追加します。
import os.path
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
このメソッドは、任意の python ファイルのディレクトリを取得します。