arctic_inference/embedding/generate_proto.py (51 lines of code) (raw):
#!/usr/bin/env python3
"""
Standalone script to generate gRPC code from the proto file.
This script is designed to be run directly without importing any modules
that might cause circular imports.
"""
import os
import subprocess
import sys
from pathlib import Path
def generate_grpc_code():
"""Generate gRPC Python code from proto file."""
# Get the directory containing this script
current_dir = Path(__file__).parent
proto_dir = current_dir / "proto"
proto_file = proto_dir / "inference.proto"
# Ensure the proto file exists
if not proto_file.exists():
print(f"Error: Proto file not found: {proto_file}")
return 1
# Create the command to generate Python code
cmd = [
sys.executable,
"-m",
"grpc_tools.protoc",
f"--proto_path={proto_dir}",
f"--python_out={proto_dir}/python/",
f"--grpc_python_out={proto_dir}/python/",
str(proto_file),
]
if not os.path.exists(proto_dir / "python"):
os.makedirs(proto_dir / "python")
# Run the command
print(f"Generating gRPC code from {proto_file}...")
try:
result = subprocess.run(cmd, check=True, capture_output=True, text=True)
print("Successfully generated gRPC code")
except subprocess.CalledProcessError as e:
print(f"Failed to generate gRPC code: {e.stderr}")
return 1
# Fix imports in the generated files
pb2_file = proto_dir / "python/inference_pb2.py"
pb2_grpc_file = proto_dir / "python/inference_pb2_grpc.py"
if pb2_file.exists() and pb2_grpc_file.exists():
# Fix imports in the grpc file
with open(pb2_grpc_file, "r") as f:
content = f.read()
# Replace relative import with absolute import
content = content.replace(
"import inference_pb2 as inference__pb2",
"from arctic_inference.embedding.proto.python import inference_pb2 as inference__pb2",
)
with open(pb2_grpc_file, "w") as f:
f.write(content)
print("Fixed imports in generated files")
print("\nGRPC code generation complete!")
print("Generated files:")
print(f"- {pb2_file}")
print(f"- {pb2_grpc_file}")
return 0
else:
print("Error: Generated files not found")
return 1
if __name__ == "__main__":
sys.exit(generate_grpc_code())