1

我从两个不同的原型生成模块,它们有一些共同的原型文件名。从 protos-1 ->

python3 -m grpc_tools.protoc --proto_path=p1/protos/ --python_out=. --grpc_python_out=. p1/protos/common/*.proto
python3 -m grpc_tools.protoc --proto_path=p1/protos/ --python_out=. --grpc_python_out=. p1/protos/p1-unique/*.proto

从 protos-2 ->

python3 -m grpc_tools.protoc --proto_path=p2/protos/ --python_out=. --grpc_python_out=. p2/protos/p2-unique/*.proto
python3 -m grpc_tools.protoc --proto_path=p2/protos/ --python_out=. --grpc_python_out=. p2/protos/common/*.proto

对 p1 和 p2 运行上述命令会覆盖commonp1 的生成模块。因此,它在生成的文件中存在问题p1-unique_pb2.py。(common模块参考不正确)

然后我尝试在一个单独的文件夹中从 protos-2 生成模块,使用

python3 -m grpc_tools.protoc --proto_path=p2/protos/ --python_out=./abc --grpc_python_out=./abc p2/protos/p2-unique/*.proto
python3 -m grpc_tools.protoc --proto_path=p2/protos/ --python_out=./abc --grpc_python_out=./abc p2/protos/common/*.proto

但进口仍然p2-unique_pb2.py是绝对的from common import common_pb2 as common_dot_common__pb2,因此指的是common由生成的模块protos-1

我尝试了提供的几种解决方案.. https://github.com/grpc/grpc/issues/9575但没有一个有助于解决这个问题。

4

1 回答 1

0

这在技术上是一个 ProtoBuf 问题。从描述中,我不知道 和是否common/*.proto相同。如果它们相同,我想您根本不会发布此问题。如果它们不同,您可以尝试将文件夹结构与原始包名称匹配。protos-1protos-2

例如,你有一个bar.proto包名为proto 的文件p2.common,那么它应该放在./p2/common/bar.proto. 该protoc命令可以只取proto_path=.. 如果有多个项目,可以考虑在编译之前将所有 proto 文件复制到一个中心位置。

有很多关于 Python 导入路径生成的已知投诉,您可以在https://github.com/protocolbuffers/protobuf/issues中找到更多信息。

于 2021-04-14T18:43:01.453 回答