You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:03:26