python mysql django dynamic-linking osx-elcapitan

python - Razón configurada incorrectamente de MySQL: uso inseguro de la ruta relativa



django dynamic-linking (2)

En OS X El Capitan (10.11), Apple agregó Protección de Integridad del Sistema .

Esto evita que los programas en ubicaciones protegidas como /usr invoquen una biblioteca compartida que utiliza una referencia relativa a otra biblioteca compartida. En el caso de _mysql.so , contiene una referencia relativa a la biblioteca compartida libmysqlclient.18.dylib .

En el futuro, la biblioteca compartida _mysql.so puede actualizarse. Hasta entonces, puede forzarlo a usar una referencia absoluta a través de la utilidad install_name_tool .

Suponiendo que libmysqlclient.18.dylib está en / usr / local / mysql / lib /, ejecute el comando:

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

Estoy usando Django, y cuando ejecuto python manage.py runserver recibo el siguiente error:

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

No estoy del todo seguro de cómo solucionar esto. He instalado MySQL-python a través de pip. Y seguí this paso antes.

También quiero señalar que esto es con El Capitan Beta 3.


Si hay muchas rutas relativas que arreglar para algo (como sucedió conmigo para la biblioteca de opencv). Puede usar el siguiente fragmento de código:

Cambie ABSPATH y LIBPATHS en consecuencia. Creará rPathChangeCmd.txt que puede pegar en la terminal. También creará rPathChangeErr.txt en caso de cualquier error. Sugiero que compruebe el archivo de error (si se creó) antes de pegar los comandos.

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