You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:05:08