手记

Python MySQLdb 导入libmysqlclient报错

摘要

flask开发相关功能,在本地测试没有问题,但是放到线上环境却报错 ImportError: libmysqlclient.so.16: cannot open shared object file: No such file or directory
检查了下发现在 /usr/lib64/mysql 下面存在libmysqlclient.so.18文件(uanme -a 确认是64位系统)


解决过程

发现问题,不是自己遇到的也没有解决办法,那就网上查呗,发现大家的思路:

  • copy /usr/lib64/mysql/libmysqlcient.so.18/usr/lib64/libmysqlclient.so.16

  • /usr/lib64/下面建立libmysqlclient.so.16的软连接

  • /etc/ld.so.conf.d/mysql-x86_64.conf里面添加 /usr/lib64/mysql

等等思路都尝试之后发现还是还是没有解决。

继续思考:

环境中明明有libmysqlclient.so.18 为何要去找libmysqlclient.so.16,

那就先考虑libmysqlclient.so.18是从和而来。 在报错中提到了_mysql.so , locate 找到_mysql.so 发现是在/root/.pyenv/versions/flask2/lib/python2.7/site-packages/_mysql.so,好项目有什么问题,找mysql.so 发现如下:

root@pts/1 # locate mysql.so/root/.pyenv/versions/2.7.12/envs/flask2/lib/python2.7/site-packages/_mysql.so
/usr/lib64/php/modules/mysql.so
/usr/lib64/php/modules/pdo_mysql.so
/usr/lib64/php-zts/modules/mysql.so
/usr/lib64/php-zts/modules/pdo_mysql.so
/var/lib/mysql/mysql.sock

猜想应该和和PHP有关系,想起来本地环境和线上环境安装的PHP不一致

本地的PHP是通过 webtatic 安装的,而服务器上面的是通过 remi安装的, 在本地执行yum list |grep libmysql

[root@i-bskmtj6q ~]# yum list |grep libmysqllibmysqlclient16.x86_64                   5.1.69-1.w6                  webtatic
libmysqlclient16-devel.x86_64             5.1.69-1.w6                  webtatic

发现libmysqlclient16 是来自于 webstatic, 故卸载之前通过remi安装的PHP,采用webstatic方式安装

## remove remiyum remove php php-fpm php-mysqlnd php-common## install from webstaticyum install php56w php56w-mysql php56w-fpm php56w-common

最后验证导入 MySQLdb 没有报错,一切正常


附加:

上文中提到了 webtaticremi 两个不同的安装源,具体的区别可以参考链接

Centos下YUM安装PHP的两种方式 http://www.jianshu.com/p/2ff15676f902



作者:全栈运维
链接:https://www.jianshu.com/p/2fe5c54c188e

0人推荐
随时随地看视频
慕课网APP