获取django app的绝对路径

tam*_*are 31 django django-settings

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

Dou*_*gal 52

Python模块(包括Django应用程序)有一个__file__属性,告诉你他们的__init__.py文件在文件系统上的位置,所以

import appname
pth = os.path.dirname(appname.__file__)
Run Code Online (Sandbox Code Playgroud)

应该做你想做的事.

在通常的情况下,os.path.absname(appname.__path__[0])但如果他们想要以奇怪的方式导入文件,应用程序可以更改它.

(尽管如此PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)),我总是这样做settings.py- 使得需要绝对路径的各种设置变得容易.)

  • @GeorgeLund你当然是对的; 我很傻.你可以做`appname .__ path __ [0]`,虽然看起来有可能改变它; 你也可以使用`os.path.dirname(appname .__ file __)`,因为`__file__`指向`__init __.py`文件. (5认同)
  • 注意,现在Django提供settings.BASE_DIR,见:http://stackoverflow.com/a/32156582/1104244 (2认同)

Kek*_*koa 13

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

import os.path

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
Run Code Online (Sandbox Code Playgroud)

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

  • @ahmoo您还可以通过`import appname获取应用程序路径; os.path.abspath则(appname中.__路径__)`. (3认同)

thc*_*ark 9

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

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

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

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

应用程序文档告诉您如何获取AppConfig对象.所以要获取AppConfig并从中打印路径:

from django.apps import apps
print(apps.get_app_config('app_label').path)
Run Code Online (Sandbox Code Playgroud)


OBu*_*OBu 5

În 较新版本的 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__)))
Run Code Online (Sandbox Code Playgroud)

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

import os    
from my_project_name.settings import BASE_DIR

os.path.join(BASE_DIR, ...)
Run Code Online (Sandbox Code Playgroud)