MySQL Incorrectamente configurado Razón: uso inseguro de la ruta relativa


Estoy usando Django, y cuando corro 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 arreglar esto. He instalado MySQL-python vía pip. Y seguí este paso anterior.

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

Author: Community, 2015-07-10

2 answers

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 llamen a una biblioteca compartida que use 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 ser actualizada. Hasta entonces, se puede forzar a utilizar una referencia absoluta a través de la install_name_tool utilidad.

Asumiendo que libmysqlclient.18.dylib está en /usr / local / mysql / lib/, entonces 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
 74
Author: Greg Glockner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-22 07:26:01

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

Cambie las rutas ABSPATH y LIBPATHS en consecuencia. Se va a crear rPathChangeCmd.txt que puede pegar en el terminal. También creará rPathChangeErr.txt en caso de errores. Yo sugeriría comprobar 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()
 0
Author: Utkarsh Bhardwaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-21 22:25:53