2012-03-23 550 views
26

我正在編寫一個單元測試,需要訪問我放在我的django應用程序目錄下「fixtures」目錄下的圖像文件。我想在我的測試中使用相對路徑打開這個圖像文件,這將需要我獲得django應用程序的絕對路徑。有沒有辦法獲得django應用程序的絕對路徑?獲取django應用程序的絕對路徑

回答

41

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

這實際上並不正確,因爲appname .__ path__是列表,而不是字符串。見http://docs.python.org/2/tutorial/modules.html#packages-in-multiple-directories – 2012-12-06 12:13:26

+5

@GeorgeLund當然,你是對的;我很愚蠢。你可以做'appname .__ path __ [0]',儘管它似乎有可能改變它;你也可以使用'os.path.dirname(appname .__ file __)',因爲'__file__'指向'__init __。py'文件。 – Dougal 2012-12-06 17:33:45

+0

你可以改變你的答案以符合你的評論,因爲答案是大多數人首先看到的。 – Igor 2016-07-15 19:04:18

11

通常,這是我在我的settings.py文件中添加的,所以我可以引用項目根目錄。

import os.path 

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

此方法將獲得任何python文件的目錄。

+0

這是聰明的,但它給人的路徑項目不應用。在我的情況下,它會工作得很好,因爲在文件系統中,我的應用程序存在於項目之下,否則它不會生成。有什麼辦法可以實際獲得應用程序的路徑嗎?或者這是我能得到的最接近的? – tamakisquare 2012-03-24 00:10:17

+0

您可以在碰巧存在於應用中的文件中使用它,或者使用os.path.join() – Kekoa 2012-03-24 00:12:36

+0

將文件夾內的應用程序的路徑追加到PROJECT_ROOT。明白了。謝謝:) – tamakisquare 2012-03-24 00:15:31