Причина неправильной настройки MySQL: небезопасное использование относительного пути

Я использую Django, и когда я запускаю python manage.py runserver, я получаю следующую ошибку:

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

Я не совсем уверен, как это исправить. Я установил MySQL-python через pip. И я выполнил этот шаг ранее.

Я также хочу отметить, что это с El Capitan Beta 3.


person nonamorando    schedule 10.07.2015    source источник
comment
тебе удалось это исправить? У меня такая же проблема   -  person cobie    schedule 24.07.2015
comment
В настоящее время я использую бета-версию 2. Вчера я обновился, но это все еще проблема.   -  person cobie    schedule 24.07.2015


Ответы (2)


В OS X El Capitan (10.11) Apple добавила защиту целостности системы.

Это не позволяет программам в защищенных расположениях, таких как /usr, вызывать общую библиотеку, которая использует относительную ссылку на другую общую библиотеку. В случае _mysql.so он содержит относительную ссылку на разделяемую библиотеку libmysqlclient.18.dylib.

В будущем общая библиотека _mysql.so может быть обновлена. А пока вы можете заставить его использовать абсолютную ссылку с помощью утилиты install_name_tool.

Предполагая, что libmysqlclient.18.dylib находится в / usr / local / 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
person Greg Glockner    schedule 05.08.2015
comment
Это также позволило мне исправить проблему с гемом mysql2 в ruby. Просто пришлось использовать мой модуль вместо _mysql.so. Спасибо. - person Dan Woodward; 05.10.2015
comment
Может ли автор проекта проголосовать за этот ответ как за правильный? - person scot; 09.10.2015
comment
К вашему сведению, если вы используете virtualenv, путь к пакетам сайтов находится внутри папки virtualenv. - person Sri; 18.11.2015
comment
Что ж, это спасло мой бекон после 4 очень напряженных дней. Меня беспокоит то, что я не знал, как узнать то, чего не знал - может ли кто-нибудь подсказать, как подготовиться к подобным вещам в будущем? Я никогда не слышал ни об install_name_tool, ни о защите целостности системы. Какие уголки Интернета мне следует просматривать, чтобы подготовиться к подобным вещам? - person tomcam; 05.01.2016
comment
действительно здорово. Это устранило мою проблему в моей системе OS X. Спасибо! - person jowett; 20.05.2017
comment
@tomcam, ты не можешь ВСЕГО знать :) j / k Я чувствую тебя на этом. В моем случае я просто знал, что поиск в Google для небезопасного использования относительного rpath libmysqlclient.18.dylib даст мне ответ. Вам просто нужно искать точную проблему во всей трассе ошибки. - person David Avikasis; 24.04.2018

Если есть много относительных путей, которые нужно исправить (как это случилось со мной для библиотеки 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()
person Utkarsh Bhardwaj    schedule 21.10.2015