首先區分兩個概念,mudule(模塊)和package(包),通俗一點來說:【參考】
- 一個 .py 文件就是個 module
- package(包)是一個包含__init__.py 文件的目錄,該目錄下一定得有這個__init__.py文件和其它模塊或子包。
如果想要import module,方法是:
import xxx # 直接導入
import xxx as xx # 重命名
from xxx import y1, y2 # 部分導入
如果想要import 某一個指定路徑下的指定module(模塊),這裏分幾種情況討論:
- 如果想要import的module在當前系統路徑的子路徑中,可以直接索引進去import
- 如果想要import的module在父目錄中,是不可以直接被import的,會報錯 can’t import top level module之類的錯誤。這時候需要將父目錄加到sys.path中去。
舉個栗子,假設目錄結構爲:
main.py
model
__init__.py
backbone.py
utils
__init__.py
model_a.py
model_b.py
- 如果我們當前的執行路徑處於main.py層級,想要import backbone模塊,而backbone.py裏面又import了model_a和model_b模塊,這時候main.py應該寫成:
import model.backbone
from model.backbone import xxx
backbone.py應該寫成:(在python3.6中,utils前不加點會報錯)
from .utils.model_a import *
from .utils.model_b import *
上面的例子中,兩級目錄下的__init__.py文件都是空的,當然也可以好好利用這個__init__.py文件,因爲package被導入時,init.py有且僅有一次執行機會,所以可以在這裏對該目錄下的module進行一下統一的管理和重命名等操作,方便後續的調用。
- 如果我們當前的執行路徑處於model_a.py層級,想要調用父目錄下的backbone模塊,直接import backbone會報錯,需要將父目錄加入sys.path纔可以,在model_a.py中寫:
import sys
sys.path.insert(0, '..')
import backbone
這樣就不會報錯了。