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

Python相对导入报错ImportError,如何正确导入跨层级Block类?

解决相对导入超出顶层包的问题

问题原因

直接运行src/world/terrain/main.py时,Python会将src/world/terrain视为顶层模块目录,而你用的from ...main import Block试图跳出这个顶层目录到src,因此触发导入错误。VS Code能定位类是因为它基于目录结构静态解析,但Python运行时的模块识别逻辑和编辑器不同。

解决方案

方案1:以包的形式运行模块

从src的上级目录执行命令,把src当作一个包来运行目标模块:

python -m src.world.terrain.main

此时src会被识别为顶层包,from ...main import Block的相对导入就能正常工作(三个点代表向上跳转三级,对应从terrain目录回到src目录)。

方案2:使用绝对导入

修改src/world/terrain/main.py中的导入语句为绝对路径:

from src.main import Block

然后确保src所在的目录在Python的搜索路径中:

  • 临时方案(Linux/macOS):
    export PYTHONPATH="/path/to/directory-containing-src"
    python src/world/terrain/main.py
    
  • 临时方案(Windows):
    set PYTHONPATH=C:\path\to\directory-containing-src
    python src\world\terrain\main.py
    
  • 永久方案:将src所在目录加入系统的PYTHONPATH环境变量。

方案3:调整项目结构

把程序入口移到src目录外,同时拆分核心类到独立模块,让内部导入更清晰。例如:

project-root/
├── main.py
└── src
    ├── __init__.py
    ├── block.py  # 将Block类从src/main.py移到这里
    └── world
        ├── __init__.py
        └── terrain
            ├── __init__.py
            └── main.py

此时src/world/terrain/main.py可以用from ...block import Block导入类,根目录的main.py负责启动程序,运行时直接执行python main.py即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:52:23