MySQL配置不当原因:相对路径使用不安全

MySQL Improperly Configured Reason: unsafe use of relative path

我正在使用 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

我不太确定如何解决这个问题。我已经通过 pip 安装了 MySQL-python。我之前遵循 this 步骤。

我还想指出这是 El Capitan Beta 3。

在 OS X El Capitan (10.11) 中,Apple 添加了 System Integrity Protection

这可以防止 /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 和 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()