2011-01-19 47 views
10

Tôi đã tải xuống và làm theo hướng dẫn cài đặt cho MySQL 5.5.8 (http://dev.mysql.com/downloads/mysql/) và cho plugin python MySQLdb. (http://sourceforge.net/projects/mysql-python/)Lỗi nhập khẩu MySQLdb lỗi - Mac 10.6

Khi tôi cố gắng để nhập khẩu MySQLdb đến một thiết bị đầu cuối python, tôi nhận được báo lỗi dưới đây:

Safira:~ yanigisawa$ python --version 
Python 2.6.1 
Safira:~ yanigisawa$ python -c "import MySQLdb" 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "build/bdist.macosx-10.6-universal/egg/MySQLdb/__init__.py", line 19, in <module> 
    File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 7, in <module> 
    File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 6, in __bootstrap__ 
ImportError: dlopen(/Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.16.dylib 
    Referenced from: /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so 
    Reason: image not found 
Safira:~ yanigisawa$ 

Tôi thấy câu hỏi 4559699 trên stack overflow, và theo các hướng dẫn có:

Safira:~ yanigisawa$ echo $DYLD_LIBRARY_PATH 
/usr/local/mysql/lib 
Safira:~ yanigisawa$ ls -l /usr/local/mysql/lib 
total 363224 
-rwxr-xr-x 1 root wheel 3787328 Jan 18 19:41 libmysqlclient.16.dylib 
-rw-r--r-- 1 root wheel 10035336 Dec 3 13:26 libmysqlclient.a 
lrwxr-xr-x 1 root wheel  23 Jan 14 22:01 libmysqlclient.dylib -> libmysqlclient.16.dylib 
lrwxr-xr-x 1 root wheel  20 Jan 14 22:01 libmysqlclient_r.16.dylib -> libmysqlclient.dylib 
lrwxr-xr-x 1 root wheel  16 Jan 14 22:01 libmysqlclient_r.a -> libmysqlclient.a 
lrwxr-xr-x 1 root wheel  20 Jan 14 22:01 libmysqlclient_r.dylib -> libmysqlclient.dylib 
-rw-r--r-- 1 root wheel 88033760 Dec 3 13:22 libmysqld-debug.a 
-rw-r--r-- 1 root wheel 84075304 Dec 3 13:26 libmysqld.a 
-rw-r--r-- 1 root wheel  8472 Dec 3 13:26 libmysqlservices.a 
drwxr-xr-x 13 root wheel  442 Dec 3 13:53 plugin 
Safira:~ yanigisawa$ md5 /usr/local/mysql/lib/libmysqlclient.16.dylib 
MD5 (/usr/local/mysql/lib/libmysqlclient.16.dylib) = b8a78a93183720021b9dbe9ddad57111 
Safira:~ yanigisawa$ 

Và sau khi làm sạch tất cả các tệp trứng trăn và xây dựng lại, tôi vẫn gặp lỗi tương tự. Sau đó, tôi tìm thấy lỗi 59006 (http://bugs.mysql.com/bug.php?id=59006) trong MySQL 5.5.8 ảnh hưởng đến Mac 10.6. Tôi đã thử các công việc xung quanh được liệt kê ở đó, làm sạch trứng và xây dựng lại, và tôi vẫn nhận được lỗi này.

Có một vấn đề khác cho vấn đề này cụ thể với python không? Tôi có thiếu cái gì khác không?

EDIT: Thêm đầu ra từ lệnh otool:

Safira:~ yanigisawa$ otool -L /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so 
/Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so: 
    libmysqlclient.16.dylib (compatibility version 16.0.0, current version 16.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1) 
Safira:~ yanigisawa$ otool -DX /usr/local/mysql/lib/libmysqlclient.16.dylib 
/usr/local/mysql/lib/libmysqlclient.16.dylib 
Safira:~ yanigisawa$ 

Trả lời

11

Bạn có thể thử chạy otool để tìm hiểu chính xác những gì con đường thư viện mở rộng MySQLdb C, _mysql.so đang tuyển dụng:

$ otool -L /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so 

và sau đó tên thư viện đã cài đặt của tệp thư viện MySQL:

$ otool -DX /usr/local/mysql/lib/libmysqlclient.16.dylib 

Nhưng bạn không cần phải sử dụng để đặt DYLD_LIBRARY_PATH (hoặc sử dụng install_name_tool để sửa đổi tệp thi hành); sự cần thiết phải đặt nó gần như luôn luôn là một dấu hiệu của một thành phần được xây dựng hoặc cài đặt không chính xác. Theo kinh nghiệm của tôi, dự án MySQL không có hồ sơ theo dõi rất tốt về tính nhất quán trong các bản dựng và cài đặt OS X của họ, vì vấn đề bạn trích dẫn có xu hướng xác nhận.

Cố gắng kết hợp hoạt động của các thư viện Python, MySQLdbMySQL trong OS X 10.6 là nguyên nhân rất phổ biến gây thất vọng: rất nhiều câu hỏi về điều này ở đây trên SO và các nơi khác. Có một số lý do cho điều đó. Lời khuyên của tôi là đi với một giải pháp hoàn chỉnh từ một trong những nhà phân phối của bên thứ ba sẽ xây dựng và cài đặt các phiên bản tương thích của mọi thứ bạn cần. Và nó sẽ tiếp tục hoạt động nếu bạn cần nâng cấp các thành phần theo thời gian. Tôi đã thành công tốt đẹp trong những năm qua với MacPorts; những người khác thích Fink hoặc mới hơn HomeBrew. Với MacPorts, sau khi cài đặt các tệp cơ sở từ MacPorts. dmg, bạn có thể nhận được tất cả mọi thứ được xây dựng như sau:

$ sudo port selfupdate # ensure the port files are up-to-date 
$ sudo port install py26-mysql 

Các MacPorts Python sẽ có mặt tại /opt/local/bin/python2.6. Nếu bạn đang muốn chạy Django, cũng có một cổng cho điều đó.

CHỈNH SỬA: Với đầu ra được cập nhật từ otool, bạn có thể thấy rằng không khớp tên đường dẫn thư viện. Phần mở rộng MySQLdb yêu cầu tên đường dẫn tương đối (không có số /) ban đầu, trong khi thư viện MySQL quảng cáo chính nó bằng một đường dẫn tuyệt đối, thường là những gì bạn muốn. Nó dường như là đảo ngược của vấn đề MySQL 59006 nhưng, mà không biết chính xác những bước bạn đã thực hiện cho đến bây giờ, nó thực sự là khó để nói làm thế nào bạn đã đến trạng thái này.Bạn có thể có thể sử dụng install_name_tool để vá _mysql.so để có tên đường dẫn tuyệt đối cũng sẽ loại bỏ mọi nhu cầu đặt DYLD_LIBRARY_PATH. Bạn nên thử:

$ cd ~/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp 
$ sudo install_name_tool -change libmysqlclient.16.dylib \ 
           /usr/local/mysql/lib/libmysqlclient.16.dylib \ 
         _mysql.so 

Nhưng điều đó không nên để bạn cảm thấy ấm áp và mờ ảo mà bạn có thể tạo lại kết quả khi bạn cần cập nhật nội dung nào đó. Có thực sự là không có đức hạnh trong cố gắng để dán tất cả các mảnh từ các nguồn khác nhau vào một cái gì đó mà các công trình.

+0

Tôi vẫn còn mới đối với Mac OS. (khoảng 2 tháng trong bây giờ) Tôi đã hy vọng để có được một "thử nghiệm bằng lửa" để nói chuyện và nhận được tất cả mọi thứ làm việc nhiều hơn hoặc ít hơn theo cách thủ công. Tuy nhiên, nếu tôi không thể làm việc này, tôi sẽ sử dụng tùy chọn cổng mac. Cám ơn vì sự gợi ý. – yanigisawa

+0

Giải pháp MacPorts cuối cùng đã hoạt động. Nó đã cài đặt python 2.6.6 bên cạnh cài đặt 2.6.1 của tôi, và/usr/bin/python vẫn trỏ đến 2.6.1, điều này gây ra lỗi giống như trên xảy ra với các script cgi apache của tôi. Tôi đã phải thêm một liên kết tượng trưng vào phiên bản 2.6.6 và mọi thứ bắt đầu hoạt động tốt. Cảm ơn. – yanigisawa

+0

Rất vui khi được nghe. Nhưng hãy cẩn thận: nói chung, đó là một ý tưởng rất xấu để ghi đè lên bất cứ điều gì trong '/ usr', khác với'/usr/local'. Đó là tất cả được quản lý bởi Apple như là một phần của OS X. Tôi không chắc chắn nếu bạn có nghĩa là bạn ghi đè '/ usr/bin/python'. Cách tốt hơn để xử lý nhiều phiên bản là sửa đổi các tệp khởi động shell để đặt '/ opt/local/Library/Frameworks/Python.framework/Phiên bản/2.6/bin' ở phía trước' $ PATH' hoặc sử dụng tham chiếu tuyệt đối khi giới thiệu sang Python, '/opt/local/bin/python2.6 '. –

49

Trong trường hợp của tôi, tôi giải quyết bằng cách thêm một vài liên kết tượng trưng như trong http://ageekstory.blogspot.com/2011/04/installing-massive-coupon-on-mac-os-10.html

như sau:

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

sudo ln -s /usr/local/mysql/lib /usr/local/mysql/lib/mysql

+0

+1: giải quyết nó ở đây quá =) –

+1

+1 đây là những gì cuối cùng đã giải quyết vấn đề của tôi sau nhiều giờ, ngay cả sau khi chỉnh sửa của Ned Deily dường như làm việc nhưng không – cerberos

+0

+1 này hoạt động! TANX !!! – karantan

1

tôi đã cố gắng giải quyết các vấn đề của một thư viện động unfound bằng cách biên dịch các module MySQLdb với thư viện tĩnh (set static = True trong site.cfg). Nhưng điều đó đã tạo ra cùng một lỗi, vì _mysql.o vẫn đang yêu cầu thư viện động. Để khắc phục điều đó, tôi đã thêm libraries = [] vào khối nếu tĩnh trong setup_posix.py.

Các vấn đề liên quan