1. 程式人生 > 其它 >python 跨資料夾引用_關於python包引用過程路徑層次的問題

python 跨資料夾引用_關於python包引用過程路徑層次的問題

技術標籤:python 跨資料夾引用

e7f211515cb23f547741c70d865b558a.png

對於

my_test - - ansemb
- - - - __init__.py
- - - - config.py
- - - - dataset
- - - - - - test.py
- - fine.py

這個目錄而言(粗體是資料夾)

因為__init__.py的存在使得ansemb變成包,

從而,同級目錄下的fine.py可以呼叫其中任何一個檔案。

__init__.py 檔案定義了包bai的屬性和方法。其實它可以什麼也不定義;可以只是一個空檔案,但是必須存在。如果 __init__.py 不存在,這個目錄就僅僅是一個目錄,而不是一個包,它就不能被匯入或者包含其它的模組和巢狀包。

config.py中我定義:

def ok():
    print(1)

bb = 1
cc = 2

我在test.py中可以引用上層目錄下config.py的檔案:

from ansemb.config import *

bb=bb
cc=cc
ok()

但是,這裡很關鍵:我不能執行test.py,因為此時config.py在其上層目錄中。

但是,我可以通過在fine.py中定義如下語句:

import ansemb.dataset.test as data

data.ok()
print(data.bb, data.cc)

來間接使用到test.py對於config.py的呼叫。

這是因為python是一種解釋性質的語言,執行過程是順序的,所以上述過程,相當於在fine.py中執行了:

from ansemb.config import *

這是可行的(config.py在其下層目錄中)。


作為一個規範的程式碼。最好不要隨便跨層次呼叫上層的庫。如果實在要執行該步驟(test.py執行過程中呼叫config.py),最好的辦法是把ansemb這個包的路徑使用:

sys.path.append()

命令,將其放到執行路徑中。

此時test.py完整程式碼如下

import os.path as osp
import sys
osp.dirname(__file__) #得到當前檔案所在路徑
osp.abspath(osp.join(this_dir, '..')) #得到絕對路徑
sys.path.append(project_root) #加入執行時路徑
from config import *