2015-07-10 56 views
27

我使用Django的,當我運行python manage.py runserver我收到以下錯誤:MySQL的不正確配置的原因:不安全使用相對路徑

ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-packages/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib 
    Referenced from: /Library/Python/2.7/site-packages/_mysql.so 
    Reason: unsafe use of relative rpath libmysqlclient.18.dylib in /Library/Python/2.7/site-packages/_mysql.so with restricted binary 

我不完全知道如何解決這個問題。我已經通過pip安裝了MySQL-python。我之前跟着this步驟。

我也想指出這是埃爾卡皮坦貝塔3

+0

你有修好嗎?我有同樣的問題 – cobie

+0

我目前在Beta 2上。昨天升級了,但這仍然是一個問題。 – cobie

+0

你是否按照我提出的問題鏈接? – wkcamp

回答

72

在OS X埃爾卡皮坦(10.11),蘋果增加System Integrity Protection

這可以防止受保護位置(如/usr)中的程序調用共享庫,該庫使用對另一個共享庫的相對引用。在_mysql.so的情況下,它包含對共享庫libmysqlclient.18.dylib的相對引用。

將來,共享庫_mysql.so可能會更新。在此之前,您可以強制它通過install_name_tool實用程序使用絕對引用。

假設libmysqlclient.18.dylib是在/ usr /本地/ MySQL的/ lib目錄/,然後運行命令:

sudo install_name_tool -change libmysqlclient.18.dylib \ 
    /usr/local/mysql/lib/libmysqlclient.18.dylib \ 
    /Library/Python/2.7/site-packages/_mysql.so 
+0

效果很好。謝謝! –

+0

這也讓我解決了ruby中的mysql2 gem問題。只需要使用我的模塊而不是_mysql.so。謝謝。 –

+0

原始海報能否將此答案投票爲正確答案? – scot

0

如果有很多相對路徑是固定的東西(與我發生了OpenCV的圖書館)。您可以使用以下片段:

相應地更改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() 
相關問題