38

我正在编写一个单元测试,它需要访问我放在 django 应用程序目录下的“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 回答
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__)))

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

import os    
from my_project_name.settings import BASE_DIR

os.path.join(BASE_DIR, ...)
于 2019-11-17T18:48:03.383 回答
1

Python3.4及以上版本自带标准库pathlib

from pathlib import Path
import appmodule

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

parent将为您提供应用程序目录的路径,/并将附加装置作为路径。

于 2019-12-05T09:13:00.240 回答
0

请记住,这appname.__path__是一个列表:

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

于 2019-01-20T21:33:16.373 回答