web-dev-qa-db-ja.com

Django appの絶対パスを取得

Django appディレクトリの直下にある "fixtures"ディレクトリに配置した画像ファイルにアクセスする必要がある単体テストを書いています。 Djangoアプリの絶対パスを取得する必要があります。Djangoアプリの絶対パスを取得する方法はありますか?

29
tamakisquare

Pythonモジュール(Djangoアプリを含む)には、ファイルシステム上の___file___ファイルの場所を示す___init__.py_属性があります。

_import appname
pth = os.path.dirname(appname.__file__)
_

あなたがしたいことをする必要があります。

通常の状況では、os.path.absname(appname.__path__[0])ですが、奇妙な方法でファイルをインポートしたい場合、アプリがそれを変更することは可能です。

(私は常に_settings.py_でPROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))を実行しますが、絶対パスにする必要があるさまざまな設定を簡単にします。)

50
Dougal

通常、これはsettings.pyファイルに追加するもので、プロジェクトルートを参照できます。

import os.path

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))

このメソッドは、任意のpythonファイルのディレクトリを取得します。

12
Kekoa

そのため、受け入れられた答えは通常うまくいきます。ただし、

  • 複数のパスを持つ名前空間パッケージ、または
  • 設定でパスを明示的に設定するアプリ、

意図したパスは、モジュールの__file__属性と一致しない場合があります。

Django(1.7+)は AppConfig.path 属性を提供します。これは単純な場合でもより明確であり、これらのEdgeの場合もカバーしています。

アプリケーションドキュメント AppConfigオブジェクトの取得方法を説明します。したがって、AppConfigを取得し、そこからパスを出力するには:

from Django.apps import apps
print(apps.get_app_config('your.app.name').path)
6
thclark

それを念頭に置いて appname.__path__はリストです:

import appname
APP_ROOT = os.path.abspath(appname.__path__[0])
file_path = os.path.join(APP_ROOT, "some_file.txt")

0
Nik