Python3.9中不修改sys.path如何导入含内部依赖的同级目录模块
Python项目导入错误解决方案
项目文件结构
hyphenated-project-root/ __init__.py src/ __init__.py module0.py > from module1 import MyClass > import module2 module1.py > class MyClass: ... module2.py > from module1 import MyClass scripts/ __init__.py script1.py > import module2
问题背景
所有__init__.py文件均为空,module0.py和script1.py都包含if __name__ == "__main__":代码块作为系统入口。在项目根目录执行python src/module0.py arg1 arg2或python scripts/script1.py(或python -m scripts.script1)时出现各类导入错误。尝试过多种import module2的写法、修改__init__.py文件、将scripts目录嵌套到src下,以及使用importlib的import_module,但均无法解决问题。需求是在不修改sys.path的前提下实现正常导入,且不使用打包系统(如setuptools构建并安装包)。
解决方法(无需修改sys.path、无需打包)
1. 统一修改为绝对导入
调整所有模块的导入语句,基于项目根目录作为顶层包路径:
src/module0.py修改后代码:from src.module1 import MyClass import src.module2 if __name__ == "__main__": # 业务逻辑代码 passsrc/module2.py修改后代码:from src.module1 import MyClassscripts/script1.py修改后代码:import src.module2 if __name__ == "__main__": # 业务逻辑代码 pass
2. 以模块方式运行脚本
在项目根目录下执行以下命令启动脚本:
- 运行
module0.py(带参数):python -m src.module0 arg1 arg2 - 运行
script1.py:python -m scripts.script1
原理说明
使用python -m运行模块时,Python会自动将当前工作目录(即项目根目录)加入sys.path,此时src和scripts会被识别为顶层包的子包,绝对导入语句就能正确定位到目标模块。
若直接运行脚本文件(如python src/module0.py),sys.path的第一个元素会被设为src/目录,无法将src识别为顶层包,导致导入失败。这种场景下无法满足“不修改sys.path”的要求,因此优先推荐-m模块运行方式。
内容的提问来源于stack exchange,提问作者michen00
相关产品推荐
相关产品推荐

