我正在写一个单元测试,需要访问一个图像文件,我把它放在django app目录下的“fixtures”目录中。我想在我的测试中使用相对路径打开这个图像文件,这需要我获得django应用程序的绝对路径。有没有办法获取django应用的绝对路径?
aiazj4mn1#
Python模块(包括Django应用程序)有一个__file__属性,它告诉你它们的__init__.py文件在文件系统中的位置,所以
__file__
__init__.py
import appname pth = os.path.dirname(appname.__file__)
应该做你想做的事在通常情况下,os.path.absname(appname.__path__[0]),但如果应用程序想要以一种奇怪的方式导入文件,则可以更改此设置。(不过,我总是在我的settings.py中使用PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))--这使得需要绝对路径的各种设置变得容易。)
os.path.absname(appname.__path__[0])
settings.py
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
j91ykkif2#
因此,接受的答案通常工作正常。然而,对于
它们的预期路径可能与模块的__file__属性不一致。Django(1.7+)提供了AppConfig.path属性-我认为即使在简单的情况下也更清晰,并且也涵盖了这些边缘情况。The application docs告诉你如何获取AppConfig对象。获取AppConfig并打印路径:
AppConfig.path
from django.apps import apps print(apps.get_app_config('app_label').path)
编辑:修改了如何使用get_app_config删除点的示例,这似乎令人困惑。这是参考文档。
get_app_config
gg0vcinb3#
通常,这是我在www.example.com文件中添加的内容settings.py,这样我就可以引用项目根。
import os.path PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
此方法将获取任何python文件的目录。
enyaitl34#
在较新版本的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, ...)
x0fgdtte5#
Python3.4及更高版本附带标准库pathlib。
pathlib
from pathlib import Path import appmodule pth = Path(appmodule.__file__).parent / 'fixtures' if pth.exists(): "Your code here"
parent将为您提供应用程序目录的路径,/将追加fixture作为路径。
parent
/
piok6c0g6#
请记住,appname.__path__是一个列表:
appname.__path__
import appname APP_ROOT = os.path.abspath(appname.__path__[0]) file_path = os.path.join(APP_ROOT, "some_file.txt")
dbf7pr2w7#
Django自动生成的设置文件有以下内容,你也可以使用BASE_DIR = Path(file).resolve().parent.parent
7条答案
按热度按时间aiazj4mn1#
Python模块(包括Django应用程序)有一个
__file__
属性,它告诉你它们的__init__.py
文件在文件系统中的位置,所以应该做你想做的事
在通常情况下,
os.path.absname(appname.__path__[0])
,但如果应用程序想要以一种奇怪的方式导入文件,则可以更改此设置。(不过,我总是在我的
settings.py
中使用PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
--这使得需要绝对路径的各种设置变得容易。)j91ykkif2#
因此,接受的答案通常工作正常。然而,对于
它们的预期路径可能与模块的
__file__
属性不一致。Django(1.7+)提供了
AppConfig.path
属性-我认为即使在简单的情况下也更清晰,并且也涵盖了这些边缘情况。The application docs告诉你如何获取AppConfig对象。获取AppConfig并打印路径:
编辑:修改了如何使用
get_app_config
删除点的示例,这似乎令人困惑。这是参考文档。gg0vcinb3#
通常,这是我在www.example.com文件中添加的内容settings.py,这样我就可以引用项目根。
此方法将获取任何python文件的目录。
enyaitl34#
在较新版本的Django(我不知道它是什么时候开始的,我想它已经存在了很多年了),默认的settingy.py包含一个条目
您可以通过导入设置文件来使用它,如下所示
x0fgdtte5#
Python3.4及更高版本附带标准库
pathlib
。parent
将为您提供应用程序目录的路径,/
将追加fixture作为路径。piok6c0g6#
请记住,
appname.__path__
是一个列表:dbf7pr2w7#
Django自动生成的设置文件有以下内容,你也可以使用
BASE_DIR = Path(file).resolve().parent.parent