Python中如何正确使用相对导入,兼顾模块导入与直接执行?
解决Python模块既支持主文件导入又能直接执行的问题
问题原因
直接运行modules/package2/module_r.py时,Python会将该文件所在的package2目录视为顶层模块目录,而非modules包的子模块,因此相对导入from ..package1.module1 import func无法识别父包;你之前尝试的绝对导入失败,是因为添加到sys.path的是modules目录而非项目根目录,导致Python在modules下寻找modules.package1,自然找不到。
解决方案
方案1:通过脚本入口判断适配两种导入方式
修改modules/package2/module_r.py代码:
if __name__ == "__main__": import os import sys # 将项目根目录(main.py所在目录)添加到sys.path project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) sys.path.insert(0, project_root) from modules.package1.module1 import func else: # 被导入时使用相对导入 from ..package1.module1 import func func()
- 当直接运行该文件时,触发
__name__ == "__main__"分支,添加根目录到路径后用绝对导入; - 被
main.py导入时,使用相对导入,保持原有逻辑正常运行。
方案2:统一使用绝对导入并正确设置路径
修改modules/package2/module_r.py代码:
import os import sys # 获取项目根目录(main.py所在目录) project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) if project_root not in sys.path: sys.path.insert(0, project_root) from modules.package1.module1 import func func()
这种方式不管是直接运行还是被导入,都用绝对导入,只要确保项目根目录在sys.path中,就能正确找到modules包。
方案3:使用Python模块运行方式(无需修改代码)
在项目根目录(即main.py所在的目录)执行以下命令:
python3 -m modules.package2.module_r
通过-m参数,Python会将modules识别为一个包,此时相对导入的逻辑可以正常工作,同时main.py导入该模块的逻辑也不受影响。
内容的提问来源于stack exchange,提问作者Desconocido
相关产品推荐
相关产品推荐

