Python mysqldb: Thư viện không được tải: libmysqlclient.18.dylib


172

Tôi vừa biên dịch và cài đặt mysqldb cho python 2.7 trên mac os 10.6 của tôi. Tôi đã tạo một tệp thử nghiệm đơn giản nhập khẩu

import MySQLdb as mysql

Đầu tiên, lệnh này được gạch chân màu đỏ và thông tin cho tôi biết "Nhập chưa được giải quyết". Sau đó, tôi đã cố chạy mã python đơn giản sau đây

import MySQLdb as mysql

def main():
    conn = mysql.connect( charset="utf8", use_unicode=True, host="localhost",user="root", passwd="",db="" )

if __name__ == '__main__'():
    main()

Khi thực hiện nó tôi nhận được thông báo lỗi sau

Traceback (most recent call last):
  File "/path/to/project/Python/src/cvdv/TestMySQLdb.py", line 4, in <module>
    import MySQLdb as mysql
  File "build/bdist.macosx-10.6-intel/egg/MySQLdb/__init__.py", line 19, in <module>
    \namespace cvdv
  File "build/bdist.macosx-10.6-intel/egg/_mysql.py", line 7, in <module>
  File "build/bdist.macosx-10.6-intel/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so
  Reason: image not found

Điều gì có thể là giải pháp cho vấn đề của tôi?

EDIT: Thật ra tôi phát hiện ra rằng thư viện nằm trong / usr / local / mysql / lib. Vì vậy, tôi cần phải nói với phiên bản nhật thực pydev của tôi để tìm nó ở đâu. Tôi đặt cái này ở đâu?

Câu trả lời:


323

Tôi đã giải quyết vấn đề bằng cách tạo một liên kết tượng trưng đến thư viện. I E

Thư viện thực tế nằm trong

/usr/local/mysql/lib

Và sau đó tôi đã tạo ra một liên kết tượng trưng trong

/usr/lib

Sử dụng lệnh:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

để tôi có ánh xạ sau:

ls -l libmysqlclient.18.dylib 
lrwxr-xr-x  1 root  wheel  44 16 Jul 14:01 libmysqlclient.18.dylib -> /usr/local/mysql/lib/libmysqlclient.18.dylib

Điều đó là vậy đó. Sau đó mọi thứ hoạt động tốt.

BIÊN TẬP:

Lưu ý rằng vì MacOS El Capitan, Bảo vệ toàn vẹn hệ thống (SIP, còn được gọi là "không gốc") sẽ ngăn bạn tạo liên kết trong /usr/lib/. Bạn có thể vô hiệu hóa SIP bằng cách làm theo các hướng dẫn sau , nhưng /usr/local/lib/thay vào đó bạn có thể tạo một liên kết :

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib

47
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
hughes

Tôi đã cài đặt mysql55qua MacPorts và để khắc phục lỗi này:sudo ln -s mysql/libmysqlclient.18.dylib /opt/local/lib/mysql55/libmysqlclient.18.dylib
philfreo

Sau khi Mavericks xóa liên kết tượng trưng cũ của tôi, tôi phải liên kết từ một vị trí hơi khác: sudo ln -s /usr/local/mysql-5.5.29-osx10.6-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Matt

2
Bạn sẽ phải tắt SIP nếu bạn đang chạy trên El Capitan: forum.developer.apple.com/thread/7935 .
Joshua Pinter

Sau khi cài đặt El Capitan mới, tôi đã thấy rằng bạn không cần phải tắt SIP cho mẹo này.
Lonoshea

135

Phương pháp ưa thích của tôi là thực sự sửa thư viện thay vì chơi với các biến môi trường có thể thực sự có thể nằm trong phạm vi tùy thuộc vào cách ứng dụng được chạy. Đây thực sự là một quá trình khá đơn giản.

Trước tiên, hãy nhìn vào đầu ra lỗi để biết vị trí của mô-đun python vi phạm:

ImportError: dlopen (/ Library không tìm thấy hình ảnh

Được rồi, vì vậy tệp vi phạm là / L Library / Python / 2.7 / site-packages / _mysql.so

Tiếp theo, hãy tìm ra nơi _mysql.so nghĩ rằng nó sẽ tìm libmysqlclient.18.dylib:

% otool -L /Library/Python/2.7/site-packages/_mysql.so
/Library/Python/2.7/site-packages/_mysql.so:
    libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

Vì vậy, nó đang tìm libmysqlclient.18.dylib không có thông tin đường dẫn, hãy khắc phục điều đó:

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

Bây giờ _mysql.so đã biết đường dẫn đầy đủ đến thư viện và mọi thứ đều hoạt động, bất kể các biến môi trường.

% otool -L /Library/Python/2.7/site-packages/_mysql.so                                                                                           
/Library/Python/2.7/site-packages/_mysql.so:
    /usr/local/mysql/lib/libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

4
Đây sẽ không phải là một giải pháp thậm chí tốt hơn để nó sửa chữa nó với tất cả các virtualenv? sudo install_name_tool -Thay đổi libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib $ VIRTUAL_ENV / lib / python2.7 / site-packages / _mysql.so
Brad Ruderman

1
@BradRuderman Tôi đoán điều quan trọng là phải rõ ràng rằng khi bạn chạy lệnh bạn đã đưa ra, bạn chỉ sửa một virtualenv - lệnh hiện tại của bạn. Hơn nữa, không phải ai cũng (gây hại cho họ) đang chạy trong virtualenv, vì vậy dòng lệnh đó sẽ không phải là một giải pháp chung chung như đã đăng.
GreenAsJade

1
Lưu ý quan trọng mà ví dụ đưa ra là sửa lỗi python / mysql toàn cầu, bạn sẽ cần sửa nó trong từng Môi trường ảo của mình. Nếu bạn giống như tôi, bạn sẽ nhìn thẳng vào phần đầu tiên nơi chúng là vị trí _mysql.so đó là một bước quan trọng.
Ben Rabidou

Điều này hoạt động cho _mysql.so được cài đặt bên trong VirtualEnvirments và không yêu cầu tắt SIP trong El Capitan.
Aaron D

Cảm ơn lời giải thích @Caleb :) :) (Y)
Sachin Malhotra

59

Tôi thấy có một giải pháp khác cho vấn đề này thay vì tạo ra một liên kết tượng trưng.

Bạn đặt đường dẫn đến thư mục của mình, nơi libmysqlclient.18.dylib cư trú, thành biến môi trường DYLD_LIBRARY_PATH. Những gì tôi đã làm là đặt dòng sau vào .bash_profile của tôi:

export DYLD_LIBRARY_PATH=/usr/local/mysql-5.5.15-osx10.6-x86/lib/:$DYLD_LIBRARY_PATH

Đó là nó.


7
Ngoài ra còn có một liên kết tượng trưng tại / usr / local / mysql trỏ đến phiên bản đã cài đặt, vì vậy tôi khuyên bạn nên thay đổi dòng của mình thành: export DYLD_LIBRARY_PATH = / usr / local / mysql / lib /: $ DYLD_LIBRARY_PATH
lén

37

Trong trường hợp của tôi, tôi đã gặp lỗi với Mac OS X 10.9 Mavericks. Tôi đã cài đặt Máy chủ Cộng đồng MySQL trực tiếp từ Trang web Oracle / MySQL từ DMG.

Tất cả những gì tôi cần làm là liên kết các tệp lib đến thư mục / usr / local / lib.

mkdir -p /usr/local/lib   
ln -s /usr/local/mysql/lib/libmysql* /usr/local/lib

Phần thưởng: Nếu bạn cũng đang chạy Mac OS X, có một công cụ tuyệt vời để tìm các tệp như tệp libmysqlclient.18.dylib, http://apps.tempel.org/FindAnyFile . Đây là cách ban đầu tôi tìm thấy vị trí của tệp dylib.


1
Tôi đã phải tạo /usr/local/libthư mục, nhưng làm việc như một cơ duyên!
Nick Merrill

25

Tôi thấy việc đưa cái này vào .profile hoặc .bashrc (bất cứ khi nào bạn sử dụng) là cách dễ nhất để làm điều đó, các liên kết sym rất lộn xộn so với việc giữ các đường dẫn trong các tệp nguồn của bạn.

Ngoài ra, so với câu trả lời của yoshisurfs, hầu hết thời gian khi mysql được cài đặt thư mục mysql nên được đổi tên thành mysql, không phải toàn bộ tên tệp, để dễ sử dụng.

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH

2
Đây có vẻ như là một câu trả lời thực sự lành mạnh và đơn giản. Làm việc tốt cho tôi - cảm ơn!
Darragh Enright

4

Tôi đã gặp phải điều này với một vài môi trường ảo.

pip uninstall MySQL-python
pip install -U MySQL-python

Làm việc cả hai lần.


Làm việc cho tôi quá
Tho


3

Đối với những người sử dụng homebrew, bạn có thể khắc phục điều này bằng:

$ brew link mysql

Điều này làm việc cho tôi, nó tạo ra một liên kết như thế này: /usr/local/lib/libmysqlclient.18.dylib -> /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib
Joshua Grigonis

2

Trong trường hợp của tôi, ở El Capitan (OSX 10.11), tôi phải làm theo ~/.bash_profile

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:${DYLD_LIBRARY_PATH}"
export PATH="/usr/local/mysql/lib:${PATH}"

2

khi bạn ở El Capitan, sẽ gặp lỗi: ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted cần phải đóng "Bảo vệ toàn vẹn hệ thống".

đầu tiên, khởi động lại và giữ cmd + R để vào chế độ Recovery, sau đó khởi chạy terminal và gõ lệnh : csrutil disable, bây giờ bạn có thể khởi động lại và thử lại.


Một cách khác bạn có thể di chuyển tệp libmysqlclient.18.dylibđến /usr/local/libvà thêm đường dẫn PATH=/usr/local/lib:$PATHđến bash_profile. Nó làm việc cho tôi.
Bun Suwanparsert

1

Trên bản cài đặt El Capitan mới, nơi SIP (rootless ngăn truy cập usr / lib /) được bật theo mặc định và bạn không thể tạo liên kết tượng trưng trừ khi bạn ở chế độ khôi phục. Như @yannisxu nói rằng bạn có thể vô hiệu hóa SIP và thực hiện liên kết tượng trưng của bạn đến / usr / lib / local và điều này sẽ hoạt động.

bạn có thể sử dụng lệnh sau trên MAC OSX El Capitan thay vì tắt SIP:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib

Đã từng có một tùy chọn nơi bạn có thể đăng nhập bằng root và điều này có thể vô hiệu hóa SIP nhưng trong bản phát hành cuối cùng đã lỗi thời, bạn có thể đọc thêm về nó tại đây: https://forums.developer.apple.com/thread/4686

Câu hỏi:

Có một lệnh nvram boot-args có sẵn trong Developer Beta 1 có thể vô hiệu hóa SIP khi chạy với quyền root:

nvram boot-args="rootless=0"

Tùy chọn vô hiệu hóa SIP này cũng sẽ có trong phiên bản phát hành El Capitan chứ? Hay đây là nghiêm ngặt cho các Nhà phát triển Xây dựng?

Câu trả lời:

Lệnh boot-args nvram này sẽ biến mất. Nó sẽ không có sẵn trong phiên bản phát hành El Capitan và có thể biến mất trước khi kết thúc Betas dành cho nhà phát triển. Theo dõi các ghi chú phát hành cho Betas dành cho nhà phát triển trong tương lai.


0

Tôi đã có vấn đề này và tôi phải mất một thời gian để tìm ra cách khắc phục nó.

Trường hợp của tôi hơi khác. Máy chủ MySQL của tôi là phiên bản 5.1.x. Và bằng cách nào đó tôi đã nâng cấp MySQL-python của mình từ 1.2.3 lên 1.2.5. Và tôi tiếp tục gặp vấn đề này kể từ đó sự kiện tôi đã thêm liên kết mềm sau đây.

libmysqlclient.18.dylib -> /usr/local/mysql/lib/libmysqlclient.18.dylib

Hóa ra đối với MySQL 5.1.x không có libmysqlclient.18.dylib, mà chỉ có libmysqlclient.16.dylib. Bạn có thể khắc phục sự cố này bằng cách hạ cấp python MySQL của bạn xuống 1.2.3 hoặc nâng cấp máy chủ MySQL của bạn lên 5.6.x (Tôi chưa thử 5.5.x.)

Tôi đã hạ cấp thư viện xuống 1.2.3 vì việc nâng cấp MySQL không phải là một lựa chọn cho tôi.


0

truy cập http://dev.mysql.com/doads/connector/c/ và tải xuống Trình kết nối / C. sau khi nhận gói, tạo một thư mục mới 'mysql', giải nén tệp Trình kết nối Mysql trong thư mục mysql, sau đó dưới mysql, tạo một thư mục trống khác 'build'.we sẽ sử dụng' build 'để xây dựng Trình kết nối MySQL / C. cd build && cmake ../your-MySQL-Connector-source-dir make && make install sau khi thực hiện cài đặt, bạn sẽ nhận được một thư mục có tên mysql dưới / usr / local. nó chứa tất cả các tiêu đề và lib bạn cần. hãy truy cập thư mục này và sao chép các tiêu đề và lib vào các vị trí tương ứng.


0

bạn co thể thử:

sudo install_name_tool -change libmysqlclient.18.dylib /Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so`

0

Lưu ý về lỗi của MySQL Connector / C trên macOS (phiên bản hiện tại của tôi là 10.13.2), sửa lỗi mysql_config và cài đặt lại mysqlclient hoặc MySQL-python, đây là chi tiết

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.