Python-opencv Error import cv2 ImportError: dlopen after update of OS X EI Captain
Question: I have this error when import cv2 after update the system of OS X EI Captain

    
    
    import cv2
    
    ImportError: dlopen(/usr/local/lib/python2.7/site-packages/cv2.so, 2): Library not loaded: lib/libopencv_shape.3.0.dylib
      Referenced from: /usr/local/lib/python2.7/site-packages/cv2.so
      Reason: unsafe use of relative rpath lib/libopencv_shape.3.0.dylib in /usr/local/lib/python2.7/site-packages/cv2.so with restricted binary
    

I have tried the method in [Cannot import cv2 because unsafe use of relative
rpath lib in cv2.so with restricted
binary](https://github.com/Itseez/opencv/issues/5447)

    
    
    rebuild build use  cmake -D BUILD_SHARED_LIBS=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
    

But it doesn't work.

Do you have any idea with this error?


Answer: This is because of SIP (System Integrity Protection) introduced in El Capitan
[link](https://support.apple.com/en-us/HT204899).

I too faced the same issue and came across this SO
[link](http://stackoverflow.com/questions/31343299/mysql-improperly-
configured-reason-unsafe-use-of-relative-path). Basically, the relative path
dependencies listed in the shared libs need to be changed to absolute paths.
There are huge number of these to be corrected in opencv libraries. You can
optionally disable SIP. I preferred to change the links instead and wrote the
following python snippet.

Change the ABSPATH and LIBPATHS if required. It can be used for any other
libraries as well. It will create rPathChangeCmd.txt which you can paste in
the terminal. It will also create rPathChangeErr.txt in case of any errors. I
would suggest check error file (if created) before pasting the commands.

    
    
    import glob
    import subprocess
    import os.path
    
    ABSPATH = "/usr/local/lib/"  # absolute path to relative libraries
    # libraries to correct
    LIBPATHS = ['/usr/local/lib/python2.7/site-packages/cv2.so', '/usr/local/lib/libopencv*'] 
    
    PREFIX = 'sudo install_name_tool -change '
    
    assert(ABSPATH.startswith('/') and ABSPATH.endswith('/'), 
        'please provide absolute library path ending with /')
    
    libs = []
    for path in LIBPATHS:
      libs += glob.glob(path)
    
    cmd =  []
    err = []
    for lib in libs:
      if not os.path.isfile(lib):
        err.append(lib+" library not found") # glob should take care
      datastr = subprocess.check_output(['otool','-l','-v', lib])
      data = datastr.split('\n') 
      for line in data:
        ll = line.split()
        if not ll: continue
        if (ll[0] == 'name' and ll[1].endswith('.dylib') and not ll[1].startswith('/')):
          libname = ll[1].split('/')[-1]
          if os.path.isfile(ABSPATH+libname):  
            cmd.append(PREFIX+ll[1]+" "+ABSPATH+libname+' '+lib)
          else:
            err.append(ABSPATH+libname+" does not exist, hence can't correct: "+ll[1]+" in: "+lib)
    
    ohandle = open("rpathChangeCmd.txt", 'w')
    for lib in cmd:
      ohandle.write(lib+'\n')
    ohandle.close()
    
    if err:
      ehandle = open("rpathChangeErr.txt", 'w')
      for e in err:
        ehandle.write(e+'\n')
      ehandle.close()
    

