本人使用的是OSX,在安裝MySQLdb的過程中遇到不少坑,和大家分享一下,也為以后留存。只是做一個整理,并不會有太多個人心得。多以評注為主。
MySQL Server 密碼重置
本機環(huán)境
Mac OS X EI Capitan
官網 Community 版 MySQL Server
虛擬環(huán)境 virtualenv
pwd:/User/jtr109/qs/
密碼重置的方式多種多樣,用很多我嘗試之后這個是我唯一可行的,和我有相同環(huán)境、情況的朋友可以參考:數據庫之mac上mysql root密碼忘記或權限錯誤的解決辦法。
遇到這個問題主要是我裝MySQL的時候不專心,傳說官方dmg裝完后是會提示設定密碼的,不知道怎么回事,反正我本地的MySQL Server就完全進不去了,只能改密碼。這篇文章講的非常清晰,簡單易懂,不做過多評論。只要每一步照做就好。此文最大的優(yōu)點是不用終端運行MySQL Server,也不用考慮 kill 進程,非常適合剛剛接觸相關內容的朋友。
安裝 MySQLdb
首先進入你需要的路徑,我們以 /User/jtr109/qs/ 為例。執(zhí)行 virtualenv venv 創(chuàng)建虛擬環(huán)境包, source venv/bin/activate 進入虛擬環(huán)境。
注意安裝模塊名
我不知道為什么這個模塊叫 MySQLdb,import 語句也是 import MySQLdb。但是你要注意,pip 安裝語句為: pip install MySQL-python。千萬不要寫錯。不過因為你在虛擬環(huán)境,所以玩脫了就這個環(huán)境包刪了就好。這也是我為什么推崇為每個項目創(chuàng)建虛擬環(huán)境的原因之一。
修改 _mysql.so 追蹤路徑
現在你可以試著進入 python, 然后運行:
>>> import MySQLdb
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jtr109/qs/venv/lib/python2.7/site-packages/MySQLdb/__init__.py", line 19, in <module>
import _mysql
ImportError: dlopen(/Users/qs/venv/lib/python2.7/site-packages/_mysql.so, 2): Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.20.dylib
Referenced from: /Users/jtr109/qs/venv/lib/python2.7/site-packages/_mysql.so
Reason: image not found
很好,你跟我遇到一樣的問題了。
此時你需要的是這篇文章:Mac OS X下修復Reason: image not found。當然,更重要的是里面給的另一個鏈接: Python mysqldb: Library not loaded: libmysqlclient.18.dylib
試著執(zhí)行:
$ otool -L /Users/jtr109/qs/venv/lib/python2.7/site-packages/_mysql.so
/Users/jtr109/mystuff/qstrategy/venv/lib/python2.7/site-packages/_mysql.so:
/usr/local/opt/mysql/lib/libmysqlclient.20.dylib (compatibility version 20.0.0, current version 20.0.0)
/usr/local/opt/openssl/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
我的 dylib 是 20 的,請根據自身調整。
來分析一下。第一個鏈接講的比較清楚了,根據報錯提示也可以看出,其實就是 MySQLdb 調用了 _mysql ,但是 _mysql.so 并沒有在默認路徑 /usr/local/opt/mysql/lib/libmysqlclient.20.dylib 找到這個文件。那接下來我們要做的就是改變他的搜索路徑:
注意我們需要用到的 install_name_tool 語句的規(guī)則如下:
install_name_tool [-change old new] input
幾個參數的對應關系:
dylib 文件默認查找路徑(old): usr/local/opt/mysql/lib/libmysqlclient.20.dylib
我們需要 dylib 查找的路徑(new): usr/local/mysql/lib/libmysqlclient.20.dylib
修改的 _mysql.so 文件位置: /Users/jtr109/qs/venv/lib/python2.7/site-packages/_mysql.so
所以執(zhí)行如下語句:
$ sudo install_name_tool -change /usr/local/opt/mysql/lib/libmysqlclient.20.dylib /usr/local/mysql/lib/libmysqlclient.20.dylib /Users/jtr109/qs/venv/lib/python2.7/site-packages/_mysql.so
這里有個很奇怪的點,兩篇參考文章的 old 路徑給的都只是文件名,我嘗試下來并不能夠改變 _mysql.so 中的查找路徑。所以無論你是否按照我的語句改變查找路徑,請務必再次執(zhí)行 otool 確定 _mysql.so 中的查找路徑是否更新了!
確認更新后,再試試在python中運行 import MySQLdb。問題解決!
Tips: 這種解決方法意味著每次你新創(chuàng)建的 virtuanenv 中需要用到 MySQL,你都必須修改 _mysql.so。第一個鏈接中有一個自制的腳本用來執(zhí)行這一操作,我沒細看,大家可以參考一下。
那就寫到這里吧,希望大家都能跑通。