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。
- Windows(cmd):
方法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
相关产品推荐
相关产品推荐

