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

运行Python子模块代码时遇ModuleNotFoundError问题求助

解决方案:Python模块跨场景导入问题

问题分析

核心矛盾在于两种运行场景下的模块解析规则差异:

  • 单独运行myManager.py时,它作为顶层脚本,所在目录会被自动加入sys.path,因此直接from myClass import runClass能生效。
  • 当myManager.py被main.py导入时,它是包内模块(属于submodule.src包),此时Python遵循包的导入规则,仅相对导入(from .myClass import runClass)符合规范,但单独运行时相对导入会报错。

你尝试的__init__.py未解决问题,大概率是因为没配合正确的导入方式或路径配置。


方案1:统一使用绝对导入(推荐)

这是Python包开发的标准做法,能彻底消除场景差异。

步骤:

  1. 在submodule目录下创建pyproject.toml,将子模块声明为可安装包:
    # pyproject.toml
    [build-system]
    requires = ["setuptools>=61.0"]
    build-backend = "setuptools.build_meta"
    
    [project]
    name = "submodule"
    version = "0.1.0"
    packages = ["submodule.src"]
    
  2. 以可编辑模式安装该包:
    cd my_project/src/submodule
    pip install -e .
    
  3. 修改myManager.py的导入语句为绝对导入:
    from submodule.src.myClass import runClass
    
  4. 此时无论是单独运行myManager.py,还是通过main.py导入,该语句都能正常工作。

方案2:动态适配导入路径(无需安装包)

如果不想将子模块安装为包,可通过动态修改sys.path适配两种场景,比try-except逻辑更清晰:

修改myManager.py代码:

import sys
from pathlib import Path

# 获取当前脚本所在目录
current_dir = Path(__file__).resolve().parent

# 判断是否为单独运行脚本场景
if __package__ is None or __package__ == "":
    # 将当前目录加入Python路径,确保能找到myClass
    sys.path.insert(0, str(current_dir))
    from myClass import runClass
else:
    # 作为包被导入时,使用相对导入
    from .myClass import runClass

方案3:通过运行方式适配(不修改代码)

若不想修改任何代码,可调整main.py的运行路径来解决:

运行main.py时,将my_project/src设为Python根路径:

cd my_project/src
python main.py

此时submodule会被视为顶级包,myManager.py中的from myClass import runClass会被解析为from submodule.src.myClass import runClass,从而正常运行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:52:36