获取django app的绝对路径

时间:2012-03-23 23:57:18

标签: django django-settings

我正在编写一个单元测试,需要访问我放在我的django app目录下的“fixture”目录中的图像文件。我想在我的测试中使用相对路径打开这个图像文件,这需要我获取django应用程序的绝对路径。有没有办法获得django app的绝对路径?

6 个答案:

答案 0 :(得分:49)

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,但这样可以轻松实现需要绝对路径的各种设置。)

答案 1 :(得分:12)

通常,这是我在settings.py文件中添加的内容,因此我可以引用项目根目录。

import os.path

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

此方法将获取任何python文件的目录。

答案 2 :(得分:6)

所以接受的答案通常都可以。但是,对于

  • 具有多个路径的命名空间包,或
  • 在配置中明确配置路径的应用

他们的预期路径可能与模块的__file__属性不一致。

Django(1.7+)提供AppConfig.path属性 - 我认为即使在简单的情况下它也更清晰,并且也涵盖了这些边缘情况。

The application docs告诉您如何获取AppConfig对象。所以要获得AppConfig并从中打印出路径:

from django.apps import apps
print(apps.get_app_config('your.app.name').path)

答案 3 :(得分:1)

Django的较新版本(我不知道它何时启动,我想它已经存在很多年了),默认的settingy.py包含一个条目

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

您可以通过导入这样的设置文件来使用

import os    
from my_project_name.settings import BASE_DIR

os.path.join(BASE_DIR, ...)

答案 4 :(得分:0)

Keep in mind that appname.__path__ is a list:

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

答案 5 :(得分:0)

Python3.4及更高版本带有标准库pathlib

from pathlib import Path
import appmodule

pth = Path(appmodule.__file__).parent / 'fixtures'
if pth.exists():
     "Your code here"

parent将为您提供应用程序目录的路径,而/将附加夹具作为路径。