我从两个不同的proto生成模块,这两个proto有一些共同的proto文件名。从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
在p2之后运行p1的上述命令将覆盖p1的生成模块common
。因此,它在生成的文件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
,因此参考protos-1
生成的common
模块
我尝试了提供的几种解决方案。。https://github.com/grpc/grpc/issues/9575但没有人帮助解决这个问题。
从技术上讲,这是一个ProtoBuf问题。从描述中,我不知道common/*.proto
在protos-1
和protos-2
之间是否相同。如果它们是一样的,我想你根本不会发布这个问题。如果它们不同,您可以尝试将文件夹结构与proto包名称相匹配。
例如,您有一个包名为p2.common
的原型文件bar.proto
,那么它应该放在./p2/common/bar.proto
。protoc
命令只能接受proto_path=.
。如果有多个项目,可以考虑在编译之前将所有proto文件复制到一个中心位置。
关于Python导入路径的生成,有很多已知的抱怨,您可以在中找到更多信息https://github.com/protocolbuffers/protobuf/issues.