`protoc` 和 `python -m grpc_tools.protoc` 之间的区别

zyx*_*xue 9 grpc grpc-python

要编译 Python 的 proto 文件,我可以

protoc -I=.--python_out=$DST_DIR sommem.proto
Run Code Online (Sandbox Code Playgroud)

基于https://developers.google.com/protocol-buffers/docs/pythontutorial

或者

python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. some.proto
Run Code Online (Sandbox Code Playgroud)

基于https://grpc.io/docs/languages/python/basics/#generate-client-and-server-code

protoc我想知道和之间有什么区别python -m grpc_tools.protoc,更推荐使用哪一个来生成 python*_pb2.py[i]文件?

顺便说一句,它看起来protoc不支持--grpc_python_out

Ric*_*lle 11

protoc仅包含协议缓冲区的逻辑。也就是说,它将生成多种语言的序列化/反序列化代码。但是,默认情况下它不会生成存根和服务器的代码。这需要通过一个称为协议插件的系统来实现单独的 RPC 系统。

Protoc 插件提供了一个简单的接口,可执行文件通过该接口获取 stdin 上协议缓冲区的描述,并在 stdout 上输出相应的生成代码。在 Google 内部,该系统用于为 Stubby 生成代码。在外部,它用于为 gRPC(或任何其他想要使用协议缓冲区的 RPC 系统)生成代码。

插件可以为自己注册一个命令行标志,以指示 protoc 应在何处输出生成的代码。因此,在上面的示例中,--python_out指示生成的序列化/反序列化代码应该放在哪里,而--grpc_python_out是 gRPC Python 代码生成器注册的标志,指示 Python 存根和服务器代码应放置在文件系统上的位置。

grpc_tools是一个 C 扩展,将两者protoc和 gRPC Python 协议插件捆绑在一起,以便用户不必处理下载protoc、下载 gRPC Python 代码生成器以及设置必要的配置以使它们正常工作。然而,从理论上讲,您应该能够将所有这些部分放在一起以使它们像这样工作grpc_tools(尽管我还没有尝试过)。