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.
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
Если есть много относительных путей, которые нужно исправить для чего-то (как это произошло со мной для библиотеки opencv). Вы можете использовать следующий фрагмент кода:
Измените ABSPATH и LIBPATH соответственно. Он создаст 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()