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

Python从同级目录嵌套模块导入类报错,求正确解决方案

问题分析与解决

你遇到的问题核心在于Python模块导入的两个关键逻辑:相对导入的生效条件和模块搜索路径(sys.path)的构成规则,以下逐个解释错误原因并给出标准解决方案:

为什么你的导入尝试都失败?

  1. from bar.xyz import XYZ 报错
    Python会在sys.path列表的目录中查找模块,你直接运行foo.py时,sys.path里默认包含的是src/foo目录,而非src目录,所以找不到bar模块。

  2. from ..bar.xyz import XYZ 报错
    相对导入(..表示父包)仅在当前脚本被当作某个包的子模块时生效。如果直接运行foo.py(比如python src/foo/foo.py),它会被视为顶层脚本,Python无法识别它的父包(src),因此相对导入失效。

  3. from src.bar.xyz import XYZ 报错
    此时sys.path里没有包含src的父目录,Python找不到名为src的模块。

标准解决方案(无需修改sys.path)

方案1:从项目根目录以模块方式运行脚本

假设你的完整项目结构是:

my_project/
    src/
        foo/
            __init__.py
            foo.py
        bar/
            __init__.py
            bar.py
            xyz.py

进入my_project目录,执行以下命令运行foo.py:

python -m src.foo.foo

此时Python会把my_project加入sys.path,你可以选择两种导入方式:

  • 绝对导入:from src.bar.xyz import XYZ
  • 相对导入:from ..bar.xyz import XYZ

方案2:将项目安装为可编辑包

在my_project目录下创建pyproject.toml文件,内容如下:

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

[project]
name = "my_project"
version = "0.1.0"

[tool.setuptools.packages.find]
where = ["src"]

然后执行命令:

pip install -e .

这会把项目以可编辑模式安装到Python环境中,之后你可以在任何位置的代码中直接使用:

from bar.xyz import XYZ

或者:

from src.bar.xyz import XYZ

关键注意点

  • 避免直接运行包内的脚本(如python src/foo/foo.py),这种方式会破坏Python的包结构识别逻辑。
  • Python 3.3+之后,__init__.py不再是包的强制要求,但保留它也不会影响导入逻辑。

内容的提问来源于stack exchange,提问作者Amol Borkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:27:28