在Python中导入Protoc生成的gRPC pb2文件时出现ModuleNotFoundError

问题描述 投票:0回答:1

尝试在 Python 中导入生成的 gRPC 模块时遇到 ModuleNotFoundError。

在我的项目中,我有这样的文件结构:

from test.api.grpc_test_cases.specific_folder.api_pb2
  • specific_folder 包含带有 .proto 文件的 proto_files 文件夹。
  • specific_folder 还同时包含 test.py 文件和生成的文件。

这是我的协议命令的样子:

  1. 首先,我生成 D.proto,因为它导入到另外两个 proto 文件中:
python3 \
-m grpc_tools.protoc \
-I proto_files \
--python_out=. \
--grpclib_python_out=. \
D.proto
  1. 然后,我生成其他 protobuf 文件(A.proto、B.proto、C.proto),它们导入 D.proto:
python3 \
-m grpc_tools.protoc \
-I proto_files \
--python_out=. \
--grpclib_python_out=. \
proto_files/A.proto \
proto_files/B.proto \
proto_files/C.proto

在我的测试文件中,当我尝试导入生成的 pb2 文件时,出现以下错误:

ModuleNotFoundError: No module named 'api_pb2'

这是我尝试导入它的方法:

from file.innerfile.innermostfile.api.api_pb2 import ServiceRequest

我尝试了多种方法来解决此问题,包括:

  • 检查Python路径以确保生成的模块位于搜索路径中。
  • 在导入语句中使用相对路径和绝对路径。
  • 在单个编译器命令中生成所有 protobuf 文件。
  • 在 grpc.py 文件中添加“from . import api_pb2”。

我预计其中一种方法可以解决 ModuleNotFoundError 问题,从而允许我导入 ServiceRequest 以在我的 pytest 测试中使用而不会出现任何错误。我想使用 pb2 文件中的

ServiceRequest
使用 pytest 创建响应对象,如下所示:

response = ServiceRequest()
response.name = "John"
response.id = 123
response.timestamp = "2023-09-18T12:00:00"
pytest protocol-buffers modulenotfounderror grpc-python protoc
1个回答
0
投票

因为protoc的路径逻辑取决于proto文件的位置。

正确的方法是让proto文件与要生成的python文件的路径位于同一文件夹中。

示例:

service
  ├── main.py
  └── proto/
       ├── __init__.py       
       ├── api.proto
       ├── api_pb2.py
       └── api_pb2_grpc.py

协议-I。 --python_out=. --grpc_python_out=. ./proto/api.proto

所有

.
相对于原型文件的位置。

另请参阅:https://stackoverflow.com/a/76946302/15715806

© www.soinside.com 2019 - 2024. All rights reserved.