2012-06-30 36 views
31

我正在使用os模塊在我的Django項目settings.py文件中有相對路徑。變量SITE_ROOT設置爲settings.py文件的當前工作目錄,然後用於引用同樣位於同一目錄中的所有static/media目錄。os.getcwd()vs os.path.abspath(os.path.dirname(__ file__))

我的繼承人問題:

print os.getcwd() 
print os.path.abspath(os.path.dirname(__file__)) 

settings.py中,上述語句都具有相同的輸出。但我的模板將只加載如果我使用SITE_ROOT = os.path.abspath(os.path.dirname(__file__))

Django就在這裏的模板:

TEMPLATE_DIRS = (
    os.path.join(SITE_ROOT, 'templates'), 
) 

SITE_ROOT設置爲os.getcwd()似乎讓Django的查找模板文件夾的目錄上面的settings.py文件

我可以一樣容易不使用os.getcwd()和我的網站運行良好,但我很好奇這裏可能會發生什麼:)

任何人都知道嗎?

+0

當前工作目錄和'__file__'不相關。第一個可以改變,這取決於你從哪裏運行你的程序,以及你是否使用'os.chdir',另一個只取決於模塊放在文件系統中的位置。 –

回答

32

正如mouad所說,os.getcwd()不會給你你所期待的。

os.getcwd()不僅僅是返回當前工作目錄。它在你的環境中默認爲$ PWD。這不是腳本所在的位置,而是您執行腳本時的位置。

作爲在/home/user和做python manage.pyos.getcwd()將返回/home/user 作爲在/home/和做python user/manage.pyos.getcwd()將返回/home

但它仍然是因爲它可以使用os.chdir()不會總是如此。換言之,就像做cd。它也會改變返回值os.getcwd()

另一方面。 __file__是模塊文件的路徑。所以你必須使用它來確定相對於你的模塊的路徑,而不是可能改變的當前工作目錄。

正如ShawnFumo所說,__file__可能並不總是絕對的。要更好地瞭解它的工作原理,可以查看該答案:Python __file__ attribute。另外,從Python3.4開始,__file__應該始終是絕對路徑。

希望它很清楚。

+0

AH好的,這對django正在尋找模板的位置非常有用。 THanks – darko

+5

請記住,'__file__'返回的內容並不總是絕對路徑,所以你應該使用'os.path.abspath'來確保。 – ShawnFumo

+0

@Loic Faure-Lacroix:很好的解釋..謝謝你:-) –

0

如果你顯示的兩個語句確實具有相同的輸出,那麼兩者都應該工作。所以要麼是:1)它們有微妙的差別,例如,一個有斜線,另一個沒有,或者2)你在一個環境中測試並在另一個環境中運行。

2

os.getcwd()給你當settings.py所在,而它會給你執行該腳本(你的情況manage.py)所在的路徑的路徑。

4

命令os.path.abspath(os.path.dirname(__file__))返回存儲代碼文件的目錄,但os.getcwd()爲您提供當前工作目錄,默認情況下執行代碼,可以使用os.chdir()命令更改後者。

相關問題