2015-07-10 21 views
27

Tôi đang sử dụng Django, và khi tôi chạy python manage.py runserver tôi nhận được lỗi sau:Lý do MySQL cấu hình không đúng: sử dụng không an toàn của đường dẫn tương đối

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 

Tôi không hoàn toàn chắc chắn làm thế nào để sửa lỗi này. Tôi đã cài đặt MySQL-python thông qua pip. Và tôi đã theo dõi this bước trước đó.

Tôi muốn cũng chỉ ra điều này là với El Capitan Beta 3.

+0

bạn có may mắn khi sửa lỗi này không? Tôi đang gặp vấn đề tương tự – cobie

+0

Tôi hiện đang ở giai đoạn Beta 2. Được nâng cấp hôm qua nhưng đây vẫn là vấn đề. – cobie

+0

Bạn đã theo liên kết tôi đưa vào câu hỏi chưa? – wkcamp

Trả lời

72

Trong OS X El Capitan (10.11), Apple đã thêm System Integrity Protection.

Điều này ngăn chương trình ở các vị trí được bảo vệ như /usr gọi điện cho thư viện được chia sẻ sử dụng tham chiếu tương đối với một thư viện được chia sẻ khác. Trong trường hợp của _mysql.so, nó chứa tham chiếu tương đối với thư viện được chia sẻ libmysqlclient.18.dylib.

Trong tương lai, thư viện được chia sẻ _mysql.so có thể được cập nhật. Cho đến lúc đó, bạn có thể buộc nó sử dụng tham chiếu tuyệt đối qua tiện ích install_name_tool.

Giả sử rằng libmysqlclient.18.dylib là trong/usr/local/mysql/lib /, sau đó chạy lệnh:

sudo install_name_tool -change libmysqlclient.18.dylib \ 
    /usr/local/mysql/lib/libmysqlclient.18.dylib \ 
    /Library/Python/2.7/site-packages/_mysql.so 
+0

hoạt động tốt. cảm ơn! –

+0

Điều này cũng cho phép tôi khắc phục vấn đề với đá quý mysql2 trong ruby. Chỉ cần sử dụng mô-đun của tôi thay vì _mysql.so. Cảm ơn. –

+0

Người đăng ký gốc có thể bỏ phiếu cho câu trả lời này là câu trả lời chính xác không? – scot

0

Nếu có rất nhiều đường dẫn tương đối để được cố định cho một cái gì đó (như đã xảy ra với tôi trong opencv thư viện). Bạn có thể sử dụng đoạn mã sau:

Thay đổi ABSPATH và LIBPATHS tương ứng. Nó sẽ tạo rPathChangeCmd.txt mà bạn có thể dán trong thiết bị đầu cuối. Nó cũng sẽ tạo rPathChangeErr.txt trong trường hợp có bất kỳ lỗi nào. Tôi sẽ đề nghị kiểm tra tập tin lỗi (nếu được tạo) trước khi dán các lệnh.

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() 
Các vấn đề liên quan