blob: d3279b6cc0bdc9ab87f21d27ec3de59802754448 [file] [log] [blame]
import sys
import subprocess
import os.path
def has_grpcio_protoc():
# type: () -> bool
""" checks if grpcio-tools protoc is installed"""
try:
import grpc_tools.protoc
except ImportError:
return False
return True
def get_proto_builtin_include_path():
"""Find include path for standard google/protobuf includes and for
nanopb.proto.
"""
if getattr(sys, 'frozen', False):
# Pyinstaller package
paths = [
os.path.join(os.path.dirname(os.path.abspath(sys.executable)), 'proto'),
os.path.join(os.path.dirname(os.path.abspath(sys.executable)), 'grpc_tools', '_proto')
]
else:
# Stand-alone script
paths = [
os.path.dirname(os.path.abspath(__file__))
]
if has_grpcio_protoc():
import pkg_resources
paths.append(pkg_resources.resource_filename('grpc_tools', '_proto'))
return paths
def invoke_protoc(argv):
# type: (list) -> typing.Any
"""
Invoke protoc.
This routine will use grpcio-provided protoc if it exists,
using system-installed protoc as a fallback.
Args:
argv: protoc CLI invocation, first item must be 'protoc'
"""
# Add current directory to include path if nothing else is specified
if not [x for x in argv if x.startswith('-I')]:
argv.append("-I.")
# Add default protoc include paths
for incpath in get_proto_builtin_include_path():
argv.append('-I' + incpath)
if has_grpcio_protoc():
import grpc_tools.protoc as protoc
import pkg_resources
proto_include = pkg_resources.resource_filename('grpc_tools', '_proto')
nanopb_include = os.path.dirname(os.path.abspath(__file__))
if not [x for x in argv if x.startswith('-I')]:
argv = argv + ["-I."]
argv = argv + ['-I' + proto_include, '-I' + nanopb_include]
return protoc.main(argv)
else:
return subprocess.call(argv)
def print_versions():
try:
if has_grpcio_protoc():
import grpc_tools.protoc
sys.stderr.write("Using grpcio-tools protoc from " + grpc_tools.protoc.__file__ + "\n")
else:
sys.stderr.write("Using protoc from system path\n")
invoke_protoc(['protoc', '--version'])
except Exception as e:
sys.stderr.write("Failed to determine protoc version: " + str(e) + "\n")
try:
sys.stderr.write("protoc builtin include path: " + str(get_proto_builtin_include_path()) + "\n")
except Exception as e:
sys.stderr.write("Failed to construct protoc include path: " + str(e) + "\n")
try:
import google.protobuf
sys.stderr.write("Python version " + sys.version + "\n")
sys.stderr.write("Using python-protobuf from " + google.protobuf.__file__ + "\n")
sys.stderr.write("Python-protobuf version: " + google.protobuf.__version__ + "\n")
except Exception as e:
sys.stderr.write("Failed to determine python-protobuf version: " + str(e) + "\n")
if __name__ == '__main__':
print_versions()