Python相对导入遇ImportError:如何跨文件夹子目录导入模块?
相对导入报错:ImportError: attempted relative import with no known parent package 的解决方法
文件夹结构
└── project ├── A │ ├── main.py │ └── __init__.py └── B ├── __init__.py ├── C ├── __init__.py └── module_x.py
问题场景
在main.py中尝试用相对导入导入module_x.py的方法:
from ..B.C.module_x import *
触发错误:
ImportError: attempted relative import with no known parent package
错误原因
直接运行main.py时,Python会将A目录视为顶层模块的所在目录,而非把project识别为父包。此时main.py被当作独立脚本运行,不存在上级包的概念,相对导入中的..无法定位到对应的父级路径。
解决方法
方法一:以包模块方式运行(推荐)
- 在
project目录下新建空的__init__.py文件,让Python将其识别为合法包。 - 切换到
project的上级目录,执行以下命令运行main.py:python -m project.A.main - 此时
main.py中的相对导入代码可以正常生效,因为Python已经将project识别为父包。
方法二:修改Python模块搜索路径(不推荐)
在main.py开头添加代码,将project目录加入Python的模块搜索路径,之后使用绝对导入:
import sys import os # 获取project目录的绝对路径并加入搜索路径 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # 直接用绝对导入导入目标模块 from B.C.module_x import *
注意事项
- 绝对导入(如
from project.B.C.module_x import *)在复杂项目中更清晰,优先推荐使用,前提是project在Python的搜索路径中。 - 避免直接运行包内部的脚本文件(如
python A/main.py),这种方式会破坏包结构的识别逻辑,应始终用python -m参数以模块方式运行包内脚本。
内容的提问来源于stack exchange,提问作者Wiliam
相关产品推荐
相关产品推荐

