python 跨資料夾引用_關於python包引用過程路徑層次的問題
阿新 • • 發佈:2020-12-26
技術標籤:python 跨資料夾引用
對於
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 *