2009-02-04 68 views
2

我在共享主機服務器上運行一個python腳本,直到今天早上有MySQL版本4.現在它有版本5.我的python腳本不能再連接到MySQL,因爲它找不到libmysqlclient_r.so.14 :如何告訴python要使用哪個版本的libmysqlclient.so?

$ python my_script.py 
Traceback (most recent call last): 
File "my_script.py", line 6, in ? 
import MySQLdb 
File "/home/lib/python2.4/site-packages/PIL-1.1.6-py2.4-linux-i686.egg/__init__.py", line 19, in ? 

File "build/bdist.linux-i686/egg/_mysql.py", line 7, in ? 
File "build/bdist.linux-i686/egg/_mysql.py", line 6, in __bootstrap__ 
ImportError: libmysqlclient_r.so.14: cannot open shared object file: No such file or directory 

有在/ usr/lib中的libmysqlclient的其他各種版本:

/usr/lib/libmysqlclient.so.15 
/usr/lib/libmysqlclient.so.14 
/usr/lib/mysql/libmysqlclient.la 
/usr/lib/mysql/libmysqlclient.so 
/usr/lib/mysql/libmysqlclient_r.so 
/usr/lib/mysql/libmysqlclient_r.a 
/usr/lib/mysql/libmysqlclient_r.la 
/usr/lib/mysql/libmysqlclient.a 
/usr/lib/libmysqlclient.so 
/usr/lib/libmysqlclient_r.so 
/usr/lib/libmysqlclient_r.so.15 
/usr/lib/libmysqlclient_r.so.15.0.0 
/usr/lib/libmysqlclient.so.15.0.0 

所以我的問題是:我怎麼能告訴巨蟒(2.4.3版本),它的libmysqlclient的版本使用?

回答

5

因爲SONAME(庫+接口的全名)是二進制文件的一部分,所以不能告訴動態鏈接器使用哪個版本的庫。

對於您的情況,您可以嘗試將libmysqlclient_r.so.14上載到主機並相應地設置LD_LIBRARY_PATH,因此在解析共享對象時告訴動態鏈接程序追加搜索系統目錄的哪個目錄。

您可以使用ldd,看是否LD_LIBRARY_PATH工作吧:

$ ldd $path_to/_mysql.so 
... 
libmysqlclient_r.so.14 => $path_to_lib/libmysqlclient_r.so.14 
... 

否則,會出現一個錯誤信息有關懸而未決的共享對象。

當然,這隻能是一個臨時的修復,直到你重建MySQLdb使用新的庫。

0

一個解決方案是將你的PYTHONPATH環境變量設置爲擁有一些本地目錄,然後複製(或鏈接,我想)你想要的mysql lib版本。

+0

嗨Sykora,謝謝 - 我試過了,但它似乎並沒有奏效。 python肯定會在PYTHONPATH中尋找共享對象嗎?我想知道是否還有另外一個env變量,我錯過了...... – Ben 2009-02-04 12:08:10

+0

根據文檔,它會在標準dirs _after_中搜索PYTHONPATH中的所有標準dirs,因此如果這不適用於您,它肯定是別的。 – sykora 2009-02-04 12:43:15

1

您將不得不重新編譯python-mysql(又名MySQLdb)以使其鏈接到新版本的libmysqlclient。

如果您的主機最初設置環境而不是編譯環境,則必須對它們進行糾纏。

/usr/lib/libmysqlclient.so.14

這看起來像舊的libmysqlclient的遺蹟,並應被刪除。 _r和.a(靜態)版本已經不存在了,你並不是真的想要混合使用庫,它只會冒着混淆automake的風險。

雖然你可以使從libmysqlclient_r.so.14一個符號鏈接到0.15,那將會只有在客戶端的新版本碰巧有對功能,您希望爲使用相同的ABI工作老 - 這不太可能,因爲這是改變版本號的關鍵。

相關問題