| ## @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 PIPE, Popen |
| |
| |
| # 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 = f""" |
| Your python protobuf is of version {python_version} but your native protoc version is of |
| version {native_version}. This will cause the installation to produce incompatible |
| protobuf files. This is bad in general - consider installing the same 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.") |