python3 import机制梳理

秉承复习自己,共享他人的原则,简单梳理下python3 import机制

首先查找器的几大顺序
1.内置
2.freeze 模块(见链接 https://wiki.python.org/moin/Freeze)
3.当前执行目录
4.第三方库

import 导入方式
1.绝对导入(用A代替)
2.相对导入(用B代替)

举个例子,如下目录结构

package
├── __init__.py
├── main.py
├── moduleA.py
├── subpackage1
│   ├── __init__.py
│   ├── moduleX.py
│   └── moduleY.py
└── subpackage2
    ├── __init__.py
    └── moduleZ.py

moduleX.py 要导入 moduleY.py

# A:
from package.subpackage1 import moduleY
# B:
from . import moduleY

moduleX.py 要导入 moduleZ.py

# A:
from package.subpackage2 import moduleZ
# B:
from ..subpackage2 import moduleZ.py

从导入来看好处与坏处

A 好处/坏处,调整项目时容易发现import路径的错误/调整项目结构的时候,import路径需要经常修改
B 好处/坏处,调整项目结构的时候,有相对位置,不需要经常调整/调整项目不宜发现导入的错误,由于相对路径的关系

踩坑提醒

引入相对路径的坑注意
由于查找器的机制,除了内置库,当前目录则是查找器的首选
若在main.py文件中有如下导入

import subpackage1.moduleX

在moduleX.py中又有如下相对引入

from ..subpackage2 import moduleZ 

执行python main.py 的时候就会告诉你超了package的top-level
因为在当前sys.path目录下是看不到上层的package,且sys.path[0]是当前执行目录,除非人为把package置为sys.path首位,不然就会出超top-level的错误

你可能感兴趣的:(python3 import机制梳理)