2009-02-04 120 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工作老 - 这不太可能,因为这是改变版本号的关键。

相关问题