從每個Python文件快速得到項目根目錄的絕對路徑

路徑問題

開發程序時,如果寫死各類資源文件的路徑,那麼如果部署環境中的路徑和開發環境不同,程序就無法正確工作。

爲了解決這個問題,需要動態獲取程序中各類資源的絕對路徑。一般資源文件是放在項目根目錄下的一些子目錄中的。

因此,只要能夠動態得到項目根目錄的絕對路徑,就能準確定位各類資源文件。

這樣寫出來的程序,不論部署在哪裏都能正常工作,也就是通常說的“綠色軟件”,解壓即可正確工作。

本文要介紹的,是利用Python的宏解決這一問題的方法。

 

計算程序絕對路徑的方法

我八年前寫過一篇文章《Python怎樣得到資源文件的絕對路徑》,該文中,我使用的方法,是得到可執行程序的絕對路徑,進而動態計算出項目的根目錄。


 

ABSPATH=None

if name == 'main':

  ABSPATH=os.path.abspath(sys.argv[0])

  ABSPATH=os.path.dirname(ABSPATH)

  print ABSPATH

 

通過拿到第一個參數的絕對路徑,我們就知道了程序所在的絕對路徑,我們就能夠使用ABSPATH這個全局變量組裝出 我們源碼目錄下的任意一個文件的絕對路徑了!

文件宏的方法

今天要介紹的是利用Python的宏來動態計算出項目的根目錄的方法。

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

print('PROJECT_ABSOLUTE_PATH:%s' % PROJECT_ABSOLUTE_PATH)

__file__是Python的宏,返回的是Python文件的路徑。os.path.abspath(__file__),返回的是Python文件的絕對路徑

上面例子中,該Python文件在項目根目錄下的第二層目錄下,因此通過上述代碼可以動態計算出項目的根目錄的絕對路徑。

 

宏方法的優勢

一般的編程語言,一個項目只有一個程序入口,只有一個可執行程序。因此,使用計算程序絕對路徑的方法來獲取項目根目錄,是非常便利的。

 

但Python是一種腳本語言,它設計的目的就是爲了取代Shell。一個Python項目中的很多個Python文件作爲主程序來運行,是非常正常的。

 

因此,使用計算程序絕對路徑的方法,來獲取項目根目錄,就會出現問題。比如說,在不同層次的包下的Python文件,他們作爲程序運行時,其需要提取的項目根目錄的層次就會不同。其他被調用的Python文件中,難以正確提取項目根目錄。

 

而使用__file__宏時,每個Python文件是通過自己的文件相對於項目根目錄的層次來獲取項目根目錄的。與哪個Python文件作爲可執行程序是無關的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章