如何告诉python使用哪个版本的libmysqlclient.so?

如何告诉python使用哪个版本的libmysqlclient.so?,python,Python,我在一个共享的托管服务器上运行python脚本,直到今天早上,该服务器还拥有MySQL版本4。现在它有了版本5。我的python脚本无法再连接到MySQL,因为它找不到libmysqlclient_r.so.14: $ python my_script.py Traceback (most recent call last): File "my_script.py", line 6, in ? import MySQLdb File "/home/lib/python2.4/site-pack

我在一个共享的托管服务器上运行python脚本,直到今天早上,该服务器还拥有MySQL版本4。现在它有了版本5。我的python脚本无法再连接到MySQL,因为它找不到libmysqlclient_r.so.14:

$ 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

所以我的问题是:我如何告诉python(版本2.4.3)使用哪个版本的libmysqlclient?

一个解决方案是将您的
PYTHONPATH
环境变量设置为具有一些本地目录,并复制(或链接)您想要的mysql库版本。

您必须重新编译python mysql(也称为MySQLdb)让它链接到新版本的libmysqlclient

如果您的主机最初是设置环境的,而不是您编译环境,那么您将不得不纠缠他们

/usr/lib/libmysqlclient.so.14

这看起来像旧libmysqlclient的残余,应该删除。_r和.a(静态)版本已经不复存在,你也不希望混合库仍然存在,这只会让automake感到困惑


虽然您可以创建一个从libmysqlclient_r.so.14到.15的符号链接,但只有当新版本的客户端恰好具有与旧版本相同的ABI时,这才起作用-这是不太可能的,因为这就是更改版本号的关键所在。

您不能告诉动态链接器要使用哪个版本的库,因为SONAME(库+接口的全名)是二进制文件的一部分

在您的情况下,您可以尝试将libmysqlclient_r.so.14上载到主机,并相应地设置
LD_LIBRARY_路径
,以便在解析共享对象时告诉动态链接器要在系统目录中另外搜索哪些目录

您可以使用
ldd
查看其
LD\u LIBRARY\u PATH
是否有效:

$ ldd $path_to/_mysql.so
...
libmysqlclient_r.so.14 => $path_to_lib/libmysqlclient_r.so.14
...
否则,将出现有关未解析共享对象的错误消息


当然,在您重建MySQLdb以使用新库之前,这只能是一个临时修复。

嗨,Sykora,谢谢——我已经尝试过了,但似乎不起作用。python是否一定会在PYTHONPATH中查找共享对象?我想知道我是否还缺少另一个env变量……根据文档,它将始终在PYTHONPATH中的任意目录后搜索标准目录,因此,如果这对您不起作用,它一定是其他的。但这仅适用于Python自己的可加载模块(.pyd on Windows,.so on ix)。libmysqlclient.so是另一个由Python模块_mysql.so链接到的库*。只有_mysql.so会在PYTHONPATH.中被查找到。任何可能遇到此问题的人。您可以这样设置您的LD_LIBRARY路径:(假设bash)export LD_LIBRARY_PATH=/usr/lib/mysql/:$LD_LIBRARY_路径显然是您的/usr/lib。。。就是你图书馆的路径。