簡體   English   中英

Python-opencv錯誤導入cv2 ImportError:更新OS X El Capitan后的dlopen

[英]Python-opencv Error import cv2 ImportError: dlopen after update of OS X El Capitan

更新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

我已經嘗試過無法導入cv2中的方法, 因為在cv2.so中使用受限二進制文件不安全地使用了相對rpath lib

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

但這是行不通的。

這是因為El Capitan link中引入了SIP(系統完整性保護)。

我也面臨同樣的問題,並遇到了這個SO 鏈接 基本上,共享庫中列出的相對路徑依賴關系需要更改為絕對路徑。 在opencv庫中有大量這些需要糾正。 您可以選擇禁用SIP。 我更喜歡更改鏈接,並編寫了以下python代碼段。

如果需要,請更改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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM