{"library":"grpcio-reflection","title":"gRPC Python Reflection","description":"grpcio-reflection is the Python implementation of the standard Protobuf Reflection Service for gRPC. It enables gRPC clients to dynamically discover available services, their RPC methods, and associated message types at runtime, without needing pre-compiled .proto files. This is particularly useful for debugging tools like grpcurl and Postman. The library is currently at version 1.80.0 and follows the gRPC core's approximately six-week release cadence.","language":"python","status":"active","last_verified":"Wed May 20","install":{"commands":["pip install grpcio-reflection"],"cli":null},"imports":["from grpc_reflection.v1alpha import reflection"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import grpc\nfrom concurrent import futures\nfrom grpc_reflection.v1alpha import reflection\n\n# --- Simulate generated protobuf code ---\n# In a real application, these would be generated by grpcio-tools\n# from your .proto files (e.g., my_service.proto).\n# For this example, we define minimal mock objects.\nclass MockService_pb2:\n    DESCRIPTOR = type('Descriptor', (object,), {'services_by_name': {'MyService': type('ServiceDescriptor', (object,), {'full_name': 'my.package.MyService'})}}})()\n\nclass MockService_pb2_grpc:\n    class MyServiceServicer:\n        def __init__(self):\n            pass\n\n    def add_MyServiceServicer_to_server(servicer, server):\n        print(f\"Mock: Adding {servicer.__class__.__name__} to server\")\n\n# --- Real gRPC server with reflection ---\n\nclass MyServiceServicer(MockService_pb2_grpc.MyServiceServicer):\n    def MyMethod(self, request, context):\n        # In a real scenario, handle actual RPC logic\n        print(f\"Received request for MyMethod: {request}\")\n        return \"Response from MyMethod\"\n\ndef serve_with_reflection(port='[::]:50051'):\n    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))\n\n    # Register your actual gRPC service implementation\n    MockService_pb2_grpc.add_MyServiceServicer_to_server(MyServiceServicer(), server)\n\n    # Enable server reflection\n    # List all service names you want to expose via reflection.\n    # This typically includes your custom services and the reflection service itself.\n    SERVICE_NAMES = (\n        MockService_pb2.DESCRIPTOR.services_by_name['MyService'].full_name,\n        reflection.SERVICE_NAME,\n    )\n    reflection.enable_server_reflection(SERVICE_NAMES, server)\n\n    server.add_insecure_port(port)\n    server.start()\n    print(f\"Server with reflection enabled listening on {port}\")\n    server.wait_for_termination()\n\nif __name__ == '__main__':\n    # To run this, you'd typically have your actual .proto files compiled\n    # and replace MockService_pb2 and MockService_pb2_grpc with your generated ones.\n    # Example usage with grpcurl (after running this script):\n    # grpcurl -plaintext localhost:50051 list\n    # grpcurl -plaintext localhost:50051 list my.package.MyService\n    # grpcurl -plaintext -d '{\"name\": \"World\"}' localhost:50051 my.package.MyService/MyMethod\n    serve_with_reflection()","lang":"python","description":"This quickstart demonstrates how to enable server reflection for a gRPC Python server. It includes a mock gRPC service setup to illustrate the integration of `grpcio-reflection`. In a real application, you would replace the `MockService_pb2` and `MockService_pb2_grpc` with the actual modules generated from your `.proto` files using `grpcio-tools`. The `reflection.enable_server_reflection` function is called with a list of fully-qualified service names you wish to expose.","tag":null,"tag_description":null,"last_tested":"2026-04-24","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]},"compatibility":{"tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","last_tested":"2026-05-20","installed_version":"1.80.0","pypi_latest":"1.80.0","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":2.8,"avg_import_s":0.44,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"grpcio-reflection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.27,"mem_mb":8.5,"disk_size":"40.0M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"grpcio-reflection","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.28,"mem_mb":8.5,"disk_size":"40.0M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"grpcio-reflection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.2,"import_time_s":0.13,"mem_mb":7.7,"disk_size":"38M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"grpcio-reflection","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.14,"mem_mb":7.7,"disk_size":"38M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"grpcio-reflection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.67,"mem_mb":9.5,"disk_size":"42.6M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"grpcio-reflection","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.78,"mem_mb":9.5,"disk_size":"42.6M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"grpcio-reflection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.7,"import_time_s":0.26,"mem_mb":9.1,"disk_size":"40M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"grpcio-reflection","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.26,"mem_mb":9.1,"disk_size":"40M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"grpcio-reflection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.83,"mem_mb":9.4,"disk_size":"34.4M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"grpcio-reflection","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.9,"mem_mb":9.4,"disk_size":"34.4M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"grpcio-reflection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.3,"import_time_s":0.45,"mem_mb":9.2,"disk_size":"32M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"grpcio-reflection","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.49,"mem_mb":9.2,"disk_size":"32M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"grpcio-reflection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.79,"mem_mb":9.7,"disk_size":"34.1M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"grpcio-reflection","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.84,"mem_mb":9.7,"disk_size":"34.0M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"grpcio-reflection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.4,"import_time_s":0.47,"mem_mb":9.4,"disk_size":"32M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"grpcio-reflection","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.53,"mem_mb":9.4,"disk_size":"32M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"grpcio-reflection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.2,"mem_mb":8.6,"disk_size":"39.5M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"grpcio-reflection","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.23,"mem_mb":8.6,"disk_size":"39.5M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"grpcio-reflection","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.6,"import_time_s":0.17,"mem_mb":7.7,"disk_size":"37M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"grpcio-reflection","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.18,"mem_mb":7.7,"disk_size":"37M"}]}}