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

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__":
        # 业务逻辑代码
        pass
    
  • src/module2.py 修改后代码:
    from src.module1 import MyClass
    
  • scripts/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:45:17