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

Python自定义包中跨文件夹导入类失败(ModuleNotFoundError)求助

解决Python跨文件夹导入的ModuleNotFoundError(无需手动添加sys.path)

我完全理解你不想依赖sys.path.append硬编码路径的想法——这确实不是长期维护的最佳方案。下面我们一步步调整你的项目结构和运行方式,让模块导入符合Python的规范,实现自然的跨文件夹导入。

第一步:调整项目结构,符合Python包规范

Python识别一个文件夹为可导入的包,核心要求是文件夹内存在__init__.py文件(即使文件是空的也可以)。请把你的项目结构调整为如下形式:

H4Impulse/
    strategies/
        __init__.py  # 空文件即可,标记这是一个Python包
        core.py      # 包含Symbol类的文件
    test/
        __init__.py  # 测试文件夹也推荐加上,可选但更符合规范
        test_symbol.py

第二步:使用正确的导入与运行方式

方式1:从项目根目录以模块形式运行测试

你之前直接运行test_symbol.py时,Python只会把脚本所在的test/目录加入sys.path,而非项目根目录,所以找不到strategies模块。

解决方法很直接:

  1. 打开终端,切换到你的项目根目录H4Impulse/
  2. 运行以下命令执行测试:
    python -m unittest test/test_symbol.py
    
    或者更省心的(自动发现所有测试文件):
    python -m unittest
    
    用python -m运行时,Python会自动把当前工作目录(项目根目录)加入sys.path,此时from strategies.core import Symbol就能正常识别模块了。

方式2:将包安装为可编辑模式(推荐长期使用)

如果希望在任何目录下都能直接导入strategies模块,或者后续要扩展包的功能,最好把项目配置为可安装的Python包。

  1. 在项目根目录H4Impulse/下创建pyproject.toml文件,内容如下:
    [build-system]
    requires = ["setuptools>=61.0"]
    build-backend = "setuptools.build_meta"
    
    [project]
    name = "h4impulse"
    version = "0.1.0"
    packages = ["strategies"]  # 指定要打包的模块
    
  2. 打开终端,在根目录运行:
    pip install -e .
    
    这个命令会把你的包以「可编辑」模式安装到Python环境中——代码修改后无需重新安装就能生效。之后不管你在哪个目录运行脚本,from strategies.core import Symbol都能正常导入。

为什么之前的相对导入无效?

你尝试的from ..strategies.core import Symbol属于相对导入,这种导入只能在包内部使用,且必须以模块形式运行(比如python -m test.test_symbol),不能直接运行脚本文件。如果直接执行test_symbol.py,Python会把它当作独立脚本而非包的一部分,因此相对导入会触发错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:19:06