无需修改路径的Python相对导入问题求解
问题解析与解决方案
为什么两种导入方式都失败?
- 绝对导入失败(
from code import moduleA):直接运行test1.py时,Python会把test1.py所在的tests目录加入模块搜索路径(sys.path),但code目录在src下,不在搜索路径范围内,因此找不到code模块。 - 相对导入失败(
from ..code import moduleA):直接运行test1.py时,它会被当作顶层脚本(__name__为__main__),Python不会将其视为src包的子模块,自然无法识别相对导入中..对应的父包结构。
正确的导入方式(无需修改路径/额外函数)
要让导入生效,需将src当作Python包,从src的父目录以模块模式运行测试脚本:
1. 确认项目目录结构(假设项目根目录为myproject)
myproject/ src/ tests/ test1.py code/ __init__.py moduleA.py moduleB.py
2. 在test1.py中使用任一导入语句
- 相对导入写法:
from ..code import moduleA moduleA.my_function(1)
- 绝对导入写法:
from src.code import moduleA moduleA.my_function(1)
3. 从项目根目录myproject执行脚本
运行命令:
python -m src.tests.test1
这种运行方式会把myproject目录加入sys.path,并将test1.py作为src.tests包的子模块加载,此时相对导入的父包、绝对导入的src模块都能被正常识别。
内容的提问来源于stack exchange,提问作者freestatelabs
相关产品推荐
相关产品推荐

