我正在编写一个单元测试,它需要访问我放在 django 应用程序目录下的“fixtures”目录中的图像文件。我想在我的测试中使用相对路径打开这个图像文件,这需要我获取 django 应用程序的绝对路径。有没有办法获取 django 应用程序的绝对路径?
6 回答
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
的 .
因此,接受的答案通常可以正常工作。然而,对于
- 具有多个路径的命名空间包,或
- 在配置中明确配置其路径的应用程序,
他们的预期路径可能与__file__
模块的属性不一致。
Django (1.7+) 提供了这个AppConfig.path
属性——我认为即使在简单的情况下也更清楚,它也涵盖了这些边缘情况。
应用程序文档告诉您如何获取 AppConfig 对象。因此,要获取 AppConfig 并从中打印路径:
from django.apps import apps
print(apps.get_app_config('app_label').path)
编辑:更改了如何使用get_app_config
删除点的示例,这似乎令人困惑。这是供参考的文档。
通常,这是我在 settings.py 文件中添加的内容,因此我可以引用项目根目录。
import os.path
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
此方法将获取任何 python 文件的目录。
Î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, ...)
Python3.4及以上版本自带标准库pathlib
。
from pathlib import Path
import appmodule
pth = Path(appmodule.__file__).parent / 'fixtures'
if pth.exists():
"Your code here"
parent
将为您提供应用程序目录的路径,/
并将附加装置作为路径。
请记住,这appname.__path__
是一个列表:
import appname
APP_ROOT = os.path.abspath(appname.__path__[0])
file_path = os.path.join(APP_ROOT, "some_file.txt")