|  | ## @package diagnose_protobuf | 
|  | # Module scripts.diagnose_protobuf | 
|  | """Diagnoses the current protobuf situation. | 
|  |  | 
|  | Protocol buffer needs to be properly installed for Caffe2 to work, and | 
|  | sometimes it is rather tricky. Specifically, we will need to have a | 
|  | consistent version between C++ and python simultaneously. This is a | 
|  | convenience script for one to quickly check if this is so on one's local | 
|  | machine. | 
|  |  | 
|  | Usage: | 
|  | [set your environmental variables like PATH and PYTHONPATH] | 
|  | python scripts/diagnose_protobuf.py | 
|  | """ | 
|  |  | 
|  | import os | 
|  | import re | 
|  | from subprocess import Popen, PIPE | 
|  |  | 
|  | # Get python protobuf version. | 
|  | try: | 
|  | import google.protobuf | 
|  | python_version = google.protobuf.__version__ | 
|  | python_protobuf_installed = True | 
|  | except ImportError: | 
|  | print("DEBUG: cannot find python protobuf install.") | 
|  | python_protobuf_installed = False | 
|  |  | 
|  | if os.name == 'nt': | 
|  | protoc_name = 'protoc.exe' | 
|  | else: | 
|  | protoc_name = 'protoc' | 
|  |  | 
|  | try: | 
|  | p = Popen([protoc_name, '--version'], stdout=PIPE, stderr=PIPE) | 
|  | out, err = p.communicate() | 
|  | except: | 
|  | print('DEBUG: did not find protoc binary.') | 
|  | print('DEBUG: out: ' + out) | 
|  | print('DEBUG: err: ' + err) | 
|  | native_protobuf_installed = False | 
|  | else: | 
|  | if p.returncode: | 
|  | print('DEBUG: protoc returned a non-zero return code.') | 
|  | print('DEBUG: out: ' + out) | 
|  | print('DEBUG: err: ' + err) | 
|  | native_protobuf_installed = False | 
|  | else: | 
|  | tmp = re.search(r'\d\.\d\.\d', out) | 
|  | if tmp: | 
|  | native_version = tmp.group(0) | 
|  | native_protobuf_installed = True | 
|  | else: | 
|  | print('DEBUG: cannot parse protoc version string.') | 
|  | print('DEBUG: out: ' + out) | 
|  | native_protobuf_installed = False | 
|  |  | 
|  | PYTHON_PROTOBUF_NOT_INSTALLED = """ | 
|  | You have not installed python protobuf. Protobuf is needed to run caffe2. You | 
|  | can install protobuf via pip or conda (if you are using anaconda python). | 
|  | """ | 
|  |  | 
|  | NATIVE_PROTOBUF_NOT_INSTALLED = """ | 
|  | You have not installed the protoc binary. Protoc is needed to compile Caffe2 | 
|  | protobuf source files. Depending on the platform you are on, you can install | 
|  | protobuf via: | 
|  | (1) Mac: using homebrew and do brew install protobuf. | 
|  | (2) Linux: use apt and do apt-get install libprotobuf-dev | 
|  | (3) Windows: install from source, or from the releases here: | 
|  | https://github.com/google/protobuf/releases/ | 
|  | """ | 
|  |  | 
|  | VERSION_MISMATCH = """ | 
|  | Your python protobuf is of version {py_ver} but your native protoc version is of | 
|  | version {native_ver}. This will cause the installation to produce incompatible | 
|  | protobuf files. This is bad in general - consider installing the same version. | 
|  | """.format(py_ver=python_version, native_ver=native_version) | 
|  |  | 
|  | # Now, give actual recommendations | 
|  | if not python_protobuf_installed: | 
|  | print(PYTHON_PROTOBUF_NOT_INSTALLED) | 
|  |  | 
|  | if not native_protobuf_installed: | 
|  | print(NATIVE_PROTOBUF_NOT_INSTALLED) | 
|  |  | 
|  | if python_protobuf_installed and native_protobuf_installed: | 
|  | if python_version != native_version: | 
|  | print(VERSION_MISMATCH) | 
|  | else: | 
|  | print('All looks good.') |