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

Python跨包导入问题求助:tests包模块外部调用触发报错

解决Python跨包导入ModuleNotFoundError问题

针对你的项目结构:

Demo
├── tests
│   ├── __init__.py
│   ├── test_1.py
│   └── test_2.py
└── main.py

报错核心原因:当从包外的main.py导入tests.test_1时,test_1.py里的from test_2 import hello属于全局绝对导入,Python会去系统模块路径中查找test_2,而非tests包内部的模块。以下是几种可行的解决方法:

方法1:使用相对导入(推荐)

修改test_1.py的导入语句为相对当前包的导入:

# test_1.py
from .test_2 import hello

这种方式完全符合Python包的设计规范,无论通过main.py导入,还是用python -m tests.test_1运行test_1.py,都能正确找到test_2模块。

注意:不要直接用python tests/test_1.py运行,此时test_1会被当作顶层模块,相对导入会失效。

方法2:使用项目根路径的绝对导入

修改test_1.py的导入语句为基于项目根的绝对路径:

# test_1.py
from tests.test_2 import hello

然后运行main.py时,需要保证项目根目录(Demo目录)在Python的模块搜索路径中:

  • 直接在Demo目录下执行:python main.py,此时当前工作目录会自动加入sys.path。
  • 如果在其他目录运行,先设置PYTHONPATH环境变量:
    • Windows(cmd):set PYTHONPATH=你的Demo目录路径
    • Linux/macOS:export PYTHONPATH=/你的Demo目录路径
      再执行main.py。

方法3:临时修改sys.path(不推荐)

在main.py中手动将项目根目录加入模块搜索路径,再导入tests:

# main.py
import sys
import os
# 获取当前文件所在目录(Demo目录)并加入sys.path
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

from tests import test_1

这种方式虽然能快速解决问题,但会将路径逻辑硬编码到代码中,降低项目的可移植性,仅适合临时测试场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 13:53:13