Skip to main content

The Buf logo

protoc-gen-grpc-py

PyPI version License Slack

protoc-gen-grpc-py generates well-typed, idiomatic gRPC stubs for protobuf-py, the ergonomic and modern Protobuf library for Python.

Fully typed clients and servicers you can read. asyncio and sync variants.
Plugs into your existing grpcio channels and servers.

QuickstartExampleprotobuf-py

It's a compatibility layer for projects already built on grpcio. The generated clients and servicers plug into your existing gRPC channels and servers, but serialize protobuf-py messages directly. This lets you upgrade to a better Protobuf package without touching your RPC stack.

[!TIP] For new projects, use Connect for Python instead. Connect speaks the gRPC and gRPC-Web protocols in addition to its own, so existing gRPC clients can call a Connect server unchanged. But you also get plain HTTP APIs you can curl, first-class streaming, and generated clients for every major language, including your frontend. protoc-gen-grpc-py only exists so current gRPC codebases can get the improvements of protobuf-py today without a full rewrite.

Quickstart

Generated code requires the runtime libraries protobuf-py and grpcio. The plugin works with Protobuf compilers like buf.

$ uv add protobuf-py grpcio
$ uv add --dev protoc-gen-py protoc-gen-grpc-py buf-bin

Add protoc-gen-grpc-py alongside protoc-gen-py in your buf.gen.yaml:

version: v2
inputs:
  - directory: proto
plugins:
  # Generates message types (*_pb.py).
  - local: protoc-gen-py
    out: src/gen
  # Generates gRPC service stubs (*_pb_grpc.py).
  - local: protoc-gen-grpc-py
    out: src/gen

To generate code for all Protobuf files within your project, run:

$ uv run -- buf generate

A *_pb_grpc.py file is generated for each proto file that declares a service. Message types come from protoc-gen-py, which also manages __init__.py files.

Feature highlights

Well-typed clients you can read

For each service, the plugin emits a client whose methods are fully typed, so editors and type checkers understand every RPC method, its request and response types, and its streaming shape:

async with grpc.aio.insecure_channel("localhost:50051") as channel:
    client = ElizaServiceClient(channel)
    response = await client.say(SayRequest(sentence="Hello!"))
    print(response.sentence)

Servicers that register themselves

Each service also gets a servicer base class with typed method signatures and an add_to_server method:

class ElizaService(ElizaServiceServicer):
    async def say(
        self, request: SayRequest, context: grpc.aio.ServicerContext
    ) -> SayResponse:
        return SayResponse(sentence=f"You said: {request.sentence}")


async def serve() -> None:
    server = grpc.aio.server()
    ElizaService().add_to_server(server)
    server.add_insecure_port("[::]:50051")
    await server.start()
    await server.wait_for_termination()

asyncio and sync, side by side

Every client and servicer is generated in both asyncio (grpc.aio) and synchronous flavors:

with grpc.insecure_channel("localhost:50051") as channel:
    client = ElizaServiceClientSync(channel)  # synchronous servicer
    response = client.say(SayRequest(sentence="Hello!"))

protobuf-py messages end to end

Requests and responses are protobuf-py messages. They have readable generated code, typed oneofs with pattern matching, real IntEnum enums, and a high-performance Rust encoder/decoder, with zero dependency on the legacy google-protobuf runtime.

Generating with protoc

The plugin also works with protoc as a standard protoc plugin:

$ uv run protoc --proto_path proto \
    --py_out src/gen \
    --grpc-py_out src/gen \
    proto/a.proto proto/b.proto proto/c.proto

Example

See the example for a complete client and server using the generated stubs, including server, client, and bidirectional streaming.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

protoc_gen_grpc_py-0.2.1.tar.gz (12.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

protoc_gen_grpc_py-0.2.1-py3-none-any.whl (12.1 kB view details)

Uploaded Python 3

File details

Details for the file protoc_gen_grpc_py-0.2.1.tar.gz.

File metadata

  • Download URL: protoc_gen_grpc_py-0.2.1.tar.gz
  • Upload date:
  • Size: 12.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for protoc_gen_grpc_py-0.2.1.tar.gz
Algorithm Hash digest
SHA256 e11a7613dc47d8a2d63df9291494088ac82ecec028ad80b5beb2cab4aaf30ff5
MD5 7b130dbb5f59a0ae514ccadc86041155
BLAKE2b-256 b255810153fa6052d752aabd46a29811ef15aaf099fadfc76af29de70f69c398

See more details on using hashes here.

Provenance

The following attestation bundles were made for protoc_gen_grpc_py-0.2.1.tar.gz:

Publisher: release.yaml on bufbuild/protoc-gen-grpc-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file protoc_gen_grpc_py-0.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for protoc_gen_grpc_py-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 96e8ceb51acd94d38b51e7822e17790bea7512920da41d9ca4a7b5ed7851bb67
MD5 71e847f1b9d5a61bcf38362e333ea71e
BLAKE2b-256 5df5871ea318f7ccdaa8d0a74a8943304e49d9cb4580e7cf0a5286399def0efd

See more details on using hashes here.

Provenance

The following attestation bundles were made for protoc_gen_grpc_py-0.2.1-py3-none-any.whl:

Publisher: release.yaml on bufbuild/protoc-gen-grpc-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page