秉承復(fù)習(xí)自己,共享他人的原則,簡(jiǎn)單梳理下python3 import機(jī)制
首先查找器的幾大順序
1.內(nèi)置
2.freeze 模塊(見(jiàn)鏈接 https://wiki.python.org/moin/Freeze)
3.當(dāng)前執(zhí)行目錄
4.第三方庫(kù)
import 導(dǎo)入方式
1.絕對(duì)導(dǎo)入(用A代替)
2.相對(duì)導(dǎo)入(用B代替)
舉個(gè)例子,如下目錄結(jié)構(gòu)
package
├── __init__.py
├── main.py
├── moduleA.py
├── subpackage1
│ ├── __init__.py
│ ├── moduleX.py
│ └── moduleY.py
└── subpackage2
├── __init__.py
└── moduleZ.py
moduleX.py 要導(dǎo)入 moduleY.py
# A:
from package.subpackage1 import moduleY
# B:
from . import moduleY
moduleX.py 要導(dǎo)入 moduleZ.py
# A:
from package.subpackage2 import moduleZ
# B:
from ..subpackage2 import moduleZ.py
從導(dǎo)入來(lái)看好處與壞處
A 好處/壞處,調(diào)整項(xiàng)目時(shí)容易發(fā)現(xiàn)import路徑的錯(cuò)誤/調(diào)整項(xiàng)目結(jié)構(gòu)的時(shí)候,import路徑需要經(jīng)常修改
B 好處/壞處,調(diào)整項(xiàng)目結(jié)構(gòu)的時(shí)候,有相對(duì)位置,不需要經(jīng)常調(diào)整/調(diào)整項(xiàng)目不宜發(fā)現(xiàn)導(dǎo)入的錯(cuò)誤,由于相對(duì)路徑的關(guān)系
踩坑提醒
引入相對(duì)路徑的坑注意
由于查找器的機(jī)制,除了內(nèi)置庫(kù),當(dāng)前目錄則是查找器的首選
若在main.py文件中有如下導(dǎo)入
import subpackage1.moduleX
在moduleX.py中又有如下相對(duì)引入
from ..subpackage2 import moduleZ
執(zhí)行python main.py 的時(shí)候就會(huì)告訴你超了package的top-level
因?yàn)樵诋?dāng)前sys.path目錄下是看不到上層的package,且sys.path[0]是當(dāng)前執(zhí)行目錄,除非人為把package置為sys.path首位,不然就會(huì)出超top-level的錯(cuò)誤