Flask应用测试时模块导入失败求助(兼容Docker部署)
解决方案
针对测试时的模块导入错误,同时保证现有Docker部署不受影响,提供以下三种可行方案:
方案一:运行测试时临时设置PYTHONPATH(无需改动代码/配置)
在项目根目录(project文件夹下)执行测试命令时,将src目录添加到Python的模块搜索路径:
PYTHONPATH=$(pwd)/src python3 -m unittest discover tests
原理:测试时Python会从src目录加载kafka_handler模块,匹配app.py中的导入语句;Docker部署时,src内容直接放在/app目录下,PYTHONPATH=/app的配置依然能让导入正常工作。
方案二:在测试目录中自动添加路径(无需每次设置环境变量)
在tests/__init__.py中添加以下代码,自动将src目录加入模块搜索路径:
import sys from pathlib import Path # 定位到项目根目录下的src文件夹 src_path = str(Path(__file__).resolve().parent.parent / "src") if src_path not in sys.path: sys.path.append(src_path)
原理:运行测试时,Python会自动加载tests/__init__.py,将src目录加入搜索路径,后续直接执行python3 -m unittest discover tests即可,Docker部署完全不受影响。
方案三:调整导入方式与Docker启动命令(符合Python包规范)
- 修改
src/app.py中的导入为相对导入:from .kafka_handler import KafkaReceiver, KafkaSender, logger - 修改Dockerfile的启动命令为模块模式:
CMD ["python", "-m", "app"]
原理:相对导入仅在包结构内有效,Docker中以模块方式启动时,Python会将/app视为包目录,匹配相对导入规则;测试时从src.app导入应用,相对导入同样能找到同目录的kafka_handler。此方案更规范,但需要调整Docker启动命令。
内容的提问来源于stack exchange,提问作者MuGh
相关产品推荐
相关产品推荐

