2015-07-10 13 views
27

sto usando Django, e quando corro python manage.py runserver ricevo il seguente errore:Motivo MySQL non configurato correttamente: utilizzo improprio di percorso relativo

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 

io non sono del tutto sicuro di come risolvere questo problema. Ho installato MySQL-python tramite pip. E ho seguito il passaggio this in precedenza.

voglio segnalare, inoltre, questo è con El Capitan Beta 3.

+0

Hai avuto fortuna nel risolvere questo problema? Sto avendo lo stesso problema – cobie

+0

Sono attualmente in Beta 2. Aggiornato ieri ma questo è ancora un problema. – cobie

+0

Hai seguito il link che ho inserito nella domanda? – wkcamp

risposta

72

In OS X El Capitan (10.11), Apple ha aggiunto System Integrity Protection.

Ciò impedisce ai programmi in posizioni protette come /usr di chiamare una libreria condivisa che utilizza un riferimento relativo a un'altra libreria condivisa. Nel caso di _mysql.so, contiene un riferimento relativo alla libreria condivisa libmysqlclient.18.dylib.

In futuro, la libreria condivisa _mysql.so potrebbe essere aggiornata. Fino ad allora, puoi forzarlo a utilizzare un riferimento assoluto tramite l'utilità install_name_tool.

Supponendo che libmysqlclient.18.dylib si trova in/usr/local/mysql/lib /, quindi eseguire il comando:

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

ha funzionato alla grande. Grazie! –

+0

Anche questo mi consente di risolvere un problema con la gemma mysql2 in ruby. Dovevo semplicemente usare il mio modulo al posto di _mysql.so. Grazie. –

+0

Il poster originale può votare questa risposta come quella corretta? – scot

0

Se ci sono un sacco di percorsi relativi da fissare per qualcosa (come è successo con me per OpenCV biblioteca). È possibile utilizzare il seguente snippet:

Modificare ABSPATH e LIBPATHS di conseguenza. Creerà rPathChangeCmd.txt che puoi incollare nel terminale. Creerà anche rPathChangeErr.txt in caso di errori. Suggerirei di controllare il file di errore (se creato) prima di incollare i comandi.

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