相对导入问题解决,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,没有报错了。

posted @   咖啡陪你  阅读(1996)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个适用于 .NET 的开源整洁架构项目模板
· AI Editor 真的被惊到了
· API 风格选对了,文档写好了,项目就成功了一半!
· 【开源】C#上位机必备高效数据转换助手
· .NET 9.0 使用 Vulkan API 编写跨平台图形应用
点击右上角即可分享
微信分享提示