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会优先匹配内置对象,无法正确导入同目录的自定义模块。 - 自定义包命名&路径配置错误:
- 你自定义的子包命名为
requests,和Python生态中常用的第三方HTTP库requests重名,存在导入优先级冲突的隐患。 - 你将
./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版本中均无法正常运行。
修正后的导入方案
- 首先修改重名文件:将
print.py改为非内置重名的名称,例如custom_print.py;将requests子包改为非第三方库重名的名称,例如my_requests,同时修正根目录的__init__.py文件名。 - 直接导入同目录模块,写法如下:
import custom_print
- 导入子包下的模块,写法如下:
from my_requests import * # 或者按需导入指定模块 from my_requests import models, code
如果需要保留原有包名,执行脚本时不要直接运行main.py,在project的上级目录执行如下命令将main作为包模块运行即可支持相对导入:
python -m project.main
内容的提问来源于stack exchange,提问作者Maxi
相关产品推荐
相关产品推荐

