2016-08-17 74 views
0

項目結構:定位項目specifc配置文件

/lib/modules/mod1.py 
/mod2.py 
/subdir1/subdir2/mod3.py 
/configs/config.yaml 

mod3.py進口mod2.pymod2.py進口mod1.pymod1.py使用os.getcwd()加載相對路徑爲mod2.py的配置文件。

的問題是,當mod3.py進口mod2.pymod1.py嘗試從路徑相對於加載配置文件,以mod3.py(即/subdir1/subdir2/configs/config.yaml代替/configs/config.yaml)--this的當然,這是行不通的。

我相信明白爲什麼這不起作用(os.getcwd()獲取原始執行文件的路徑)。

我怎樣才能解決這個問題,使mod1.py將使用相對mod2.py的路徑,即使mod2.pymod3.py進口?

+0

也許重寫代碼以避免從相對位置加載文件將是最好的選擇,但是如果你必須,看看'mod2 .__ file__' ... – twalberg

+0

問題是'mod2.py'的位置會因項目而異,但項目中的文件將始終遵循相對路徑。在這個例子中,'mod1.py'是從項目結構中加載的 - 但是如果是從項目結構之外的位置加載的,mod2.py'的位置將用於建立config.yaml的位置。 – user2487593

回答

0

我一直沒能找到一個內置的方式在Python做到這一點,所以我落得這樣做是這樣的:

mod1.py: 
configs_list = os.getcwd().split('/') 
for x in configs_list: 
    # Check each directory in list, bottom up. 'pop()' list on 
    # each failure. Assign var and break loop when configs path is found. 
    if not os.path.exists('/'.join(configs_list) + '/configs'): 
     configs_list.pop() 
    else: 
     configs_path = '/'.join(configs_list) + '/configs' 
     break 

configs_path然後用前綴具體的配置文件名(s)mod1.py。由於每次調用mod1.py都會發生在項目目錄結構中,並且每個項目只有一個configs目錄,因此應該(並且迄今爲止)正確標識configs目錄,而不管項目中運行給定腳本的位置。

我打開更好或更多的Pythonic方式做到這一點,如果有人有輸入。