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