Python跨目录导入失败求助:寻求非绝对路径实现方案
问题原因与解决方案
核心问题
你的代码结构里,src目录未被Python识别为可导入的包,测试脚本的执行路径不在模块搜索范围内,导致找不到containers模块;同时containers.py里的导入写法依赖当前工作目录,健壮性不足。
解决步骤
1. 将src转为Python包
在src目录下创建空的__init__.py文件,让Python把它识别为合法包:
/project ├── /src │ ├── __init__.py # 新增空文件 │ ├── /services │ │ ├── __init__.py # 可选,也可添加 │ │ └── service1.py │ └── containers.py ...
2. 修正导入语句
修改containers.py为绝对导入,摆脱对工作目录的依赖:
from dependency_injector import containers, providers from src.services.service1 import DataService # 改为绝对路径导入 class Container(containers.DeclarativeContainer): data_service = providers.Factory(DataService)
同时调整test_service1.py的导入路径:
import pytest from src.containers import Container # 从src包导入目标模块 data_service = Container.data_service()
3. 让Python识别src包(二选一即可)
方式一:设置PYTHONPATH环境变量
进入/project目录,执行对应系统的命令:
- Linux/macOS:
export PYTHONPATH=$(pwd):$PYTHONPATH pytest tests/services-tests/test_service1.py - Windows(命令提示符):
set PYTHONPATH=%cd%;%PYTHONPATH% pytest tests/services-tests/test_service1.py
方式二:可编辑安装项目(推荐)
在/project目录下创建pyproject.toml文件:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "your-project-name" version = "0.1.0" packages = ["src"]
执行命令将项目安装为可编辑模式:
pip install -e .
之后无论在哪个目录运行测试,都能正确导入src下的模块。
4. (可选)优化测试执行
在/project目录下创建pytest.ini文件,自动配置Python路径:
[pytest] testpaths = tests pythonpath = src
后续直接运行pytest即可,无需手动设置环境变量。
内容的提问来源于stack exchange,提问作者isswf
相关产品推荐
相关产品推荐

