我需要使用 gRPC 发送 python Decimal。 为此,我编写了这个简化的原型文件
syntax = "proto3";
package grpc.dec;
import "google/type/decimal.proto";
message Data {
google.type.Decimal total = 1;
}
我已经安装到我的 venv 中了
(venv) ➜ pip list
Package Version
------------------------ -------
googleapis-common-protos 1.63.0
grpcio 1.63.0
grpcio-tools 1.63.0
pip 23.0.1
protobuf 4.25.3
setuptools 58.1.0
所以我有
site-packages/google/type/decimal.proto
带有十进制消息
然后grpcio-tools
运行
python -m grpc_tools.protoc -I./proto --python_out=./proto/ --grpc_python_out=./proto/ --mypy_out=./proto/ ./proto/*.proto
但是运行这个命令时我得到了什么
google/type/decimal.proto: File not found.
dec.proto:5:1: Import "google/type/decimal.proto" was not found or had errors.
dec.proto:210:3: "google.type.Decimal" is not defined.
我尝试了不同的变体和 chatGPT 建议,但没有任何效果。请解释一下它应该如何工作
google/type/decimal.proto
,您需要确保在调用 googleapis
时可以访问其存储库
--proto_path
(使用 protoc
)。
要执行此操作:
GOOGLEAPIS="${PWD}"
git clone \
https://github.com/googleapis/googleapis \
${GOOGLEAPIS}
protoc
引用--proto_path=${GOOGLEAPIS}
:python \
-m grpc_tools.protoc \
--proto_path=${GOOGLEAPIS} \
--proto_path=${PWD}/proto \
--python_out=${PWD}/proto \
--grpc_python_out=${PWD}/proto \
--mypy_out=${PWD}/proto \
${PWD}/proto/*.proto
--proto_path
(-I
) 标志为 protoc
提供了一种查找协议缓冲区源的机制。
在您的情况下,它会在每个
--proto_path
中查找包含以下树的文件夹:
.
└── google
└── type
└── decimal.proto
因为
import
套餐是google/type/decimal.proto
。
这是反映
decimal.proto
的 package google.type
的传统方式(注意包中的 .
是文件系统上的文件夹)。
googleapis
存储库包含这棵树,因此它满足 protoc
。