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

Difference between `protoc` and `python -m grpc_tools.protoc`

要为 Python 编译原型文件,我可以

protoc -I=.--python_out=$DST_DIR sommem.proto

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

python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. some.proto

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

请问protocpython -m grpc_tools.protoc有什么区别,更推荐生成python*_pb2.py[i]个文件?

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

protoc 只包含协议缓冲区的逻辑。也就是说,它将为多种语言生成 serialization/deserialization 代码。但是,默认情况下它不会为存根和服务器生成代码。这留给了通过称为 protoc 插件的系统来分离 RPC 系统。

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

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

grpc_tools is a C extensionprotoc 和 gRPC Python 协议插件捆绑在一起,这样用户就不必处理下载 protoc,下载 gRPC Python 代码生成器,并设置必要的配置以使它们能够正常工作。但是,理论上,您应该能够将所有这些部分组合在一起,使它们像 grpc_tools 一样工作(尽管我没有尝试过)。