38

django app ディレクトリのすぐ下にある「fixtures」ディレクトリに配置した画像ファイルにアクセスする必要がある単体テストを作成しています。相対パスを使用してテストでこの画像ファイルを開きたいのですが、django アプリの絶対パスを取得する必要があります。django アプリの絶対パスを取得する方法はありますか?

4

6 に答える 6

65

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ます -- 絶対パスにする必要があるさまざまな設定を簡単にします。)

于 2012-03-27T03:09:18.717 に答える
17

したがって、受け入れられた答えは通常うまくいきます。ただし、

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

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

Django (1.7+) はAppConfig.path属性を提供します。これは、単純なケースでもより明確であり、これらのエッジケースもカバーしていると思います。

アプリケーションのドキュメントには、AppConfig オブジェクトを取得する方法が記載されています。したがって、AppConfig を取得してパスを出力するには、次のようにします。

from django.apps import apps
print(apps.get_app_config('app_label').path)

編集:get_app_configドットを削除するために使用する方法の例を変更しましたが、これは混乱しているようです。参照用のドキュメントは次のとおりです。

于 2018-04-17T09:09:18.583 に答える
15

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

import os.path

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

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

于 2012-03-24T00:00:44.383 に答える