相对导入问题解决,ImportError:attempted relative import with no known parent package
前言
本文中,我将会分析报错 ImportError: attempted relative import with no known parent package 的原因。
当运行python脚本,使用了相对引用方式 (类似 import module) 去引用包时,可能会出现找不到父级包的异常。
问题
以以下目录为例,当从在module2.py文件中运行from .. import dir1时(module1与module2均为自定义的.py文件),python解释器报出以上错误。
1 2 3 4 5 6 7 8 | . ├── run.py └── Project ├── dir1 │ └── module1.py ├── dir2 │ └── module2.py └── test.py |
为了验证问题,在module2中添加以下代码
1 | print ( '__file__={0:<35} | __name__={1:<20} | __package__={2:<20}' . format (__file__,__name__, str (__package__))) |
运行结果显示: __name__ = __main__ 和 __package__ = None,python解释器没有关于模块所属的包的任何信息,因此它抛出了找不到父级包的异常。
尝试一
尝试了的解决方案一,在dir1, dir2中创建一个新的空 __init__.py 文件来将项目目录转换为一个包。目录更新如下:
1 2 3 4 5 6 7 8 9 10 | . ├── run.py └── Project ├── dir1 │ ├── __init__.py │ └── module1.py ├── dir2 │ ├── __init__.py │ └── module2.py └── test.py |
但在分别运行以下两条import代码时,仍然报错。说明问题仍没有解决。
1 2 | import dir1 #绝对导入 from .. import dir1 #相对导入 |
尝试二
又尝试了其他的方法,添加命令from __future__ import absolute_import, 但是仍报错。
解决方案
尝试了以上两种相对导入的解决方法后,有点儿灰心,决定尝试绝对导入的方法,终于粗暴地把问题解决了。
首先使用python自带的sys模块,查看绝对导入的路径:
1 2 | import sys print (sys.path) |
发现没有文件dir1,dir2的路径,那么直接在sys.path中添加其路径,即能成功导入了。以我的路径为例:
1 2 3 4 5 6 | import sys print (sys.path) sys.path.append( '/home/user/fqm/Project' ) sys.path.append( '/home/user/fqm/Project/dir1' ) sys.path.append( '/home/user/fqm/Project/dir2' ) # '/home/user/fqm/'为示例的项目路径,换成你的即可 |
这样就能正常运行绝对导入import dir1,没有报错了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)