首先区分两个概念,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
这样就不会报错了。