包含了
__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