使用grpcio工具在生成的模块导入中实现相对路径



我从两个不同的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/*.protoprotos-1protos-2之间是否相同。如果它们是一样的,我想你根本不会发布这个问题。如果它们不同,您可以尝试将文件夹结构与proto包名称相匹配。

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

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

相关内容

  • 没有找到相关文章

最新更新