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

Python3.9导入模块报错attempted relative import with no known parent如何解决

问题诱因
  • 相对导入使用场景不符合规则:from . import print这类带.的相对导入仅支持在被作为包组成部分导入的模块中使用。当你直接执行python main.py时,main.py会被标记为顶层的__main__模块,不属于任何Python包,Python无法识别到它的父包为project目录,因此抛出attempted relative import with no known parent错误。
  • 自定义模块存在命名冲突:你将自定义模块命名为print.py,和Python内置的print()函数重名,直接执行import print时Python会优先匹配内置对象,无法正确导入同目录的自定义模块。
  • 自定义包命名&路径配置错误:
    1. 你自定义的子包命名为requests,和Python生态中常用的第三方HTTP库requests重名,存在导入优先级冲突的隐患。
    2. 你将./requests目录加入sys.path后再执行from requests import *,相当于要求Python在搜索路径中找名为requests的包,但你已经将requests目录本身加入了搜索路径,此时搜索路径下可直接找到models.py、code.py,无法再匹配到名为requests的包,导入逻辑错误。
  • 包标识文件命名错误:你的project根目录下的包标识文件写为__init__py,缺少.,正确命名应为__init__.py,无效的包标识文件会导致Python不将project目录识别为合法的Python包。
旧版本Python兼容性说明

上述导入写法仅部分在Python 2.x版本中可正常运行,Python 3全版本均不符合导入规则:

  • Python 2.x默认开启隐式相对导入,同目录下的print.py直接写import print可以成功导入(但依然存在命名冲突的隐患),但from . import print的写法即使在Python 2.x中直接执行main.py也会触发相同的相对导入错误。
  • sys.path拼接子目录再导包的写法本身存在逻辑错误,在所有Python版本中均无法正常运行。
修正后的导入方案
  1. 首先修改重名文件:将print.py改为非内置重名的名称,例如custom_print.py;将requests子包改为非第三方库重名的名称,例如my_requests,同时修正根目录的__init__.py文件名。
  2. 直接导入同目录模块,写法如下:
import custom_print
  1. 导入子包下的模块,写法如下:
from my_requests import *
# 或者按需导入指定模块
from my_requests import models, code

如果需要保留原有包名,执行脚本时不要直接运行main.py,在project的上级目录执行如下命令将main作为包模块运行即可支持相对导入:

python -m project.main

内容的提问来源于stack exchange,提问作者Maxi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:15:02