Python相对导入:单点与无点导入的差异及报错原因咨询
Python相对导入报错原因及两种导入的差异
一、两种导入的核心区别
- 绝对导入:
from my_module import say_hi是从Python的sys.path列表里查找模块。当你直接运行脚本时,脚本所在的当前目录会被自动添加到sys.path中,所以能顺利找到my_module.py。 - 相对导入:
from .my_module import say_hi是基于当前文件所在的包层级结构来定位模块的,它要求Python把当前文件识别为某个包的子模块,而非独立运行的脚本。
二、为什么相对导入会报错
你直接运行包含这条相对导入语句的脚本时,Python会将该脚本视为顶级执行脚本,不会把它当作某个包的一部分。此时脚本没有“父包”的上下文,自然无法解析.代表的相对路径,就会抛出ImportError: attempted relative import with no known parent package。
哪怕目录里有__init__.py也没用——__init__.py是用来标记目录为Python包的,但直接运行脚本的行为会跳过包的识别逻辑。PyCharm能识别两种写法,是因为IDE自动把项目根目录设为了源代码根,模拟了包环境,但实际命令行运行时的环境和IDE不一样。
三、让相对导入生效的方法
如果一定要用相对导入,有两种可行方式:
- 把整个项目当作包来运行:在项目根目录执行
python -m 你的包名.目标脚本名,这里的“你的包名”是包含__init__.py和my_module.py的目录名称。 - 不要直接运行该脚本,而是将它作为模块,被项目里的其他脚本导入使用。
内容的提问来源于stack exchange,提问作者Aenaon
相关产品推荐
相关产品推荐

