2011-07-08 188 views
4

我有以下目錄結構的Python項目:訪問資源文件

 
project/ 
project/src/ 
project/src/somecode.py 
project/src/mypackage/mymodule.py 
project/src/resources/ 
project/src/resources/datafile1.txt 

在mymodule.py,我有一個類(可以稱之爲「MyClass的」),這需要加載datafile1.txt。這種類型的作品,當我做:

開放(「../resources/datafile1.txt」)

假設創建創建的MyClass的實例從somecode.py運行代碼。

但是,我有單元測試mymodule.py在該文件中定義,如果我離開相對路徑名如上所述,單元測試代碼爆炸,因爲代碼正在從項目/ src/mypackage而不是project/src,並且相關文件路徑無法正確解析。

任何有關解決此問題的最佳實踐類型方法的建議?如果我將測試用例移動到項目/ src中,使用測試用例混淆主源文件夾。

回答

0

在包含Python腳本的每個目錄中,放置一個知道層次結構根目錄路徑的Python模塊。它可以用相對路徑定義一個單一的全局變量。在每個腳本中導入此模塊。 Python首先搜索當前目錄,以便始終使用當前目錄中的模塊版本,該目錄將具有當前目錄根目錄的相對路徑。然後用這個來找到你的其他文件。例如:

# rootpath.py 
rootpath = "../../../" 

# in your scripts 
from rootpath import rootpath 
datapath = os.path.join(rootpath, "src/resources/datafile1.txt") 

如果你不想把額外的模塊在每個目錄,你可以使用這種方法:

把一個哨兵文件在目錄結構中,例如頂層thisisthetop.txt。讓Python腳本在目錄層次結構中向上移動,直到找到此文件。寫下所有相對於該目錄的路徑名。

您可能已經將項目目錄中已有的某些文件用於此目的(例如繼續向上移動,直至找到src目錄),或者您可以用明顯的方式命名項目目錄。

+0

艾奇,但工程。謝謝。 –

0

文件路徑將相對於您最初調用的腳本。我建議你將相對路徑作爲參數傳遞給MyClass。這樣,根據哪個腳本正在調用MyClass,您可以擁有不同的路徑。

+0

這不是真的,文件路徑相對於調用腳本時的工作目錄。 –

5

我通常使用它從我的模塊中獲取相對路徑。從來沒有嘗試過單元測試。

import os 

print(os.path.join(os.path.dirname(__file__), 
        '..', 
        'resources' 
        'datafile1.txt')) 

注意:..技巧工作得很好,但如果您更改目錄結構,則需要更新該部分。