使用带有 Decimal google 类型的 grpcio-tools 生成 _pb2 python 文件

问题描述 投票:0回答:1

我需要使用 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 建议,但没有任何效果。请解释一下它应该如何工作

python protocol-buffers grpc
1个回答
0
投票

要使用

google/type/decimal.proto
,您需要确保在调用 googleapis
 时可以访问其存储库 
--proto_path
(使用 
protoc
)。

要执行此操作:

  1. 克隆存储库(您可以将其存储在任何您想要的位置)
GOOGLEAPIS="${PWD}"

git clone \
https://github.com/googleapis/googleapis \
${GOOGLEAPIS}
  1. 重新运行
    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

© www.soinside.com 2019 - 2024. All rights reserved.