【问题标题】:Python-opencv Error import cv2 ImportError: dlopen after update of OS X El CapitanPython-opencv Error import cv2 ImportError: dlopen after update of OS X El Capitan
【发布时间】:2016-01-20 12:28:27
【问题描述】:

更新 OS X El Capitan 系统后导入 cv2 时出现此错误

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

我试过Cannot import cv2 because unsafe use of relative rpath lib in cv2.so with restricted binary中的方法

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

但它不起作用。

【问题讨论】:

标签: python macos opencv


【解决方案1】:

这是因为 El Capitan link 中引入了 SIP(​​系统完整性保护)。

我也遇到了同样的问题,遇到了这个 SO link。基本上,共享库中列出的相对路径依赖项需要更改为绝对路径。在 opencv 库中有大量这些需要纠正。您可以选择禁用 SIP。我更喜欢更改链接并编写以下 python sn-p。

如果需要,更改 ABSPATH 和 LIBPATHS。它也可以用于任何其他库。它将创建 rPathChangeCmd.txt,您可以将其粘贴到终端中。如果出现任何错误,它还将创建 rPathChangeErr.txt。我建议在粘贴命令之前检查错误文件(如果已创建)。

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()

【讨论】:

    猜你喜欢
    • 2017-02-17
    • 2016-02-28
    • 2016-05-07
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    相关资源
    最近更新 更多