python-3.x - 使用 grpcio-tools 在生成的模块导入中实现相对路径
问题描述
我从两个不同的原型生成模块,它们有一些共同的原型文件名。从 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 运行上述命令会覆盖common
p1 的生成模块。因此,它在生成的文件中存在问题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但没有一个有助于解决这个问题。
解决方案
这在技术上是一个 ProtoBuf 问题。从描述中,我不知道 和是否common/*.proto
相同。如果它们相同,我想您根本不会发布此问题。如果它们不同,您可以尝试将文件夹结构与原始包名称匹配。protos-1
protos-2
例如,你有一个bar.proto
包名为proto 的文件p2.common
,那么它应该放在./p2/common/bar.proto
. 该protoc
命令可以只取proto_path=.
. 如果有多个项目,可以考虑在编译之前将所有 proto 文件复制到一个中心位置。
有很多关于 Python 导入路径生成的已知投诉,您可以在https://github.com/protocolbuffers/protobuf/issues中找到更多信息。
推荐阅读
- mysql - 有条件地计数,同时也分组
- variables - 终端中的变量 ${i%.*} 是什么意思?
- xcode - Universal Links 停止在 iOS 13 上调用应用程序(应用程序 userActivity ...)
- c# - 在使用 Google Drive .NET API 上传文件时,有时会出现 Null ResponseBody
- clockify - TimeIntervalDto 对象中的持续时间数据类型
- python - 有没有办法使用 Compute Engine API + NodeJS 修改 Compute Engine 虚拟机中的文件
- mongodb - 当 mongodb 实例作为 SECONDARY 添加到副本集时,本地用户和角色会发生什么?
- javascript - 如何通过过滤其中一个属性来找到对象内部的对象?
- sql-server - 使用 OpenXML 分解 XML
- reactjs - gatsby-image 获取组件中未定义的道具