包含了
__init__.py文件夹的称为包
import <>
from <> import <>,<>
from <> import * (不建议使用)
import <> as <> (别名)
目录树例子
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
import <> 或 from <> import <> 这两种语法. 连接import package.subpackage1.moduleX as moduleX
from package.subpackage1 import moduleY
from subpackage2 import moduleZ
# moduleX.py
import moduleY
# moduleA.py
import package.subpackage1.moduleX
会在 moduleA 的视角寻找导入的moduleX中导入的moduleY
ModuleNotFoundError: No module named ‘moduleY‘
同一个包下的模块可以很方便的相互引用,.代表本层目录,..代表上层目录,以此类推。
顶层包的包名改了,包下的模块的相对导入的语句基本不用改。
相对导入只能使用 from <> import <>,在subpackage1/moduleX.py中,可以使用如下方式导入
from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
__package__可以查询顶包是哪个目录树例子
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
在模块 moduleY 中引入 subpackage2 包下的 moduleZ 模块:
# moduleY.py
from ..subpackage2 import moduleZ
执行文件 moduleA.py 的代码:
# moduleA.py
import subpackage1.moduleY
ValueError: attempted relative import beyond top-level package
因为模块 moduleY 所在的顶级包是 subpackage1,而 subpackage1 包下不存在子包 subpackage2。
执行 python moduleX.py 将会引发 ModuleNotFoundError: No module named ‘__main__.moduleY‘; ‘__main__‘ is not a package 异常。
# moduleX.py
from .moduleY import *
原文:https://www.cnblogs.com/L-GH/p/15309928.html