Flask调用gRPC遇ModuleNotFoundError: No module named 'queue_pb2'求助
解决Flask客户端导入gRPC pb2文件的ModuleNotFoundError问题
问题分析
出现ModuleNotFoundError: No module named 'queue_pb2'的核心原因有三点:
microservices/queue未被识别为Python包,缺少必要的__init__.py文件- 生成的
queue_pb2_grpc.py使用了绝对导入import queue_pb2,但从Flask应用的上下文(根目录下的app.py)无法直接找到该模块 - Python解释器的sys.path未包含项目根目录,导致无法识别
microservices层级的包
解决方案
1. 将microservices/queue转为Python包
在microservices/queue目录下创建空的__init__.py文件,让Python将该目录识别为可导入的包:
Cloud/ |-- app.py |-- microservices/ |-- queue/ |-- __init__.py # 新增空文件 |-- protos/ |-- queue.proto |-- queue_pb2.py |-- queue_pb2_grpc.py
2. 修正gRPC生成文件的导入语句
打开microservices/queue/queue_pb2_grpc.py,将顶部的导入语句:
import queue_pb2 as queue__pb2
修改为相对导入:
from . import queue_pb2 as queue__pb2
这样同一包内的queue_pb2.py就能被正确识别。
3. 确保项目根目录加入Python路径
在app.py的开头添加以下代码,将项目根目录(Cloud/)加入Python的搜索路径:
import sys from pathlib import Path # 将项目根目录添加到sys.path sys.path.append(str(Path(__file__).parent))
4. 重新生成pb文件(可选,更规范的方式)
如果不想手动修改导入语句,可以在**项目根目录(Cloud/)**下执行以下命令重新生成pb文件,确保生成的导入语句符合包结构:
python -m grpc_tools.protoc -I microservices/queue/protos --python_out=microservices/queue --grpc_python_out=microservices/queue microservices/queue/protos/queue.proto
该命令会自动生成符合包路径的导入语句,无需手动修改。
验证
完成以上步骤后,重新执行flask run,即可解决模块找不到的问题。
内容的提问来源于stack exchange,提问作者poetisme
相关产品推荐
相关产品推荐

