需求:
数据库自动化脚本使用python开发,因为目前还有很多数据库的主机系统是centos6,或centos7,上面的python版本是2.x所以,但又要兼容更高版本,所以计划使用pyinstaller插件对python程序进行打包。
问题:
在centos7上使用pyinstaller打包的程序在centos6执行,会遇报错:
./xxx_ora_check: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /tmp/_MEIqcHOuD/libz.so.1)
解决方案:
查询相关资料显示,最好的解决方案就是在所要支持的最老版本上打包。
而且我的脚本是在python2.7上开发,所以尝试在centos6.4上先安装python2.7,然后再安装对应的pip,pyinstaller版本,进行打包。
操作流程:
登录到准备打包的主机上。
查看python的版本
python -V
Python 2.6.6
1,下载Python-2.7.5
#wget https://www.python.org/ftp/python/2.7.5/Python-2.7.5.tgz
也可以直接下载好传到主机上,我使用的是这种方式
2,解压
#tar vxf Python-2.7.5.tar.xz
3,更改工作目录
#cd Python-2.7.5
4,安装
./configure --prefix=/usr/local/python27 --enable-share --with-ssl
make && make install
*1这里的编译参数需要注意添加--enable-share
*2这里我不想再手动设置lib目录,所以多写了一级目录python27,这样再安装插件时,每次都需要再/usr/bin中手动创建软连接。如果这里直接写/usr/local路径,在可能会报lib找不到的错误,需要修改
5,查看版本信息
#/usr/local/python27/bin/python2.7 -V
6,建立软连接,使系统默认的 python指向 python2.7
#mv /usr/bin/python /usr/bin/python2.6.6
#ln -s /usr/local/python27/bin/python2.7 /usr/bin/python
7,重新检验Python 版本
#python -V
2.7.5
此时已在主机上安装了python2.7.5
8,解决系统 Python 软链接指向 Python2.7 版本后,因为yum是不兼容 Python 2.7的,所以yum不能正常工作,我们需要指定 yum 的Python版本
#vim /usr/bin/yum
将文件头部的
#!/usr/bin/python
改成
#!/usr/bin/python2.6.6
9,然后安装setuptools和pip
安装setuptools
下载:
https://pypi.org/project/setuptools/40.0.0/
最新版本不再支持python 2.7,所以要找一个旧版本
如果直接安装pip可能报错需要setuptools
Traceback (most recent call last):
File "setup.py", line 8, in <module>
from setuptools import find_packages, setup
ImportError: No module named setuptools
,所以先安装setuptools
安装setuptools
unzip setuptools-40.0.0.zip
cd setuptools-40.0.0
python setup.py install
安装pip
tar -zvxf pip-20.3.tar.gz
cd pip-20.3
python setup.py install
如果安装后找不到pip命令
需要创建软连接
查找pip安装路径
find / -name pip
/tmp/pip-20.3/src/pip
/tmp/pip-20.3/build/lib/pip
/usr/local/python27/lib/python2.7/site-packages/pip-20.3-py2.7.egg/pip
/usr/local/python27/bin/pip
应为最后一个/usr/local/python27/bin/pip
测试一下:
/usr/local/python27/bin/pip -V
备份之前的python软连接
创建软连接
ln -sv /usr/local/python27/bin/pip /usr/bin/pip
离线安装PyInstaller
tar -zvxf PyInstaller-3.6.tar.gz
cd PyInstaller-3.6
python setup.py build(这一步没有验证)
python setup.py install
我在使用离线包安装没有成功,于是连上网使用pip 在线安装
也可以在线安装,找一个国内的源
pip install pyinstaller==3.0 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
如果安装报错:
IOError: Python library not found: libpython2.7mu.so.1.0, libpython2.7.so.1.0, libpython2.7m.so.1.0, libpython2.7m.so
This would mean your Python installation doesn't come with proper library files.
This usually happens by missing development package, or unsuitable build parameters of Python installation.
* On Debian/Ubuntu, you would need to install Python development packages
* apt-get install python3-dev
* apt-get install python-dev
* If you're building Python by yourself, please rebuild your Python with `--enable-shared` (or, `--enable-framework` on Darwin)
表示缺少 libpython2.7.so.1.0 库,在编译python的时候记得添加--enable-shared参数,前面编译python时忘记了,需要重新编译一次python。
如果前面流程正确,还是报这个错误记得在系统中搜索这个包:
find / -name libpython2.7.so.1.0
如果能找到,复制一份放到 /usr/lib64/ 中
cp libpython2.7.so.1.0 /usr/lib64/
此时再安装,就没有问题了。
最坑的点:
由于我的在本机上还是找不到libpython2.7.so.1.0,于是从其他环境中搜索到这个库,传到本机上。解决了打包报错的问题。但是当我运行打好的文件时,和我在高版本环境中打的包一样,还是报错:
./xxx_ora_check: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /tmp/_MEIqcHOuD/libz.so.1)
甚至当我尝试把libpython2.7.so.1.0 通过pyinstaller一起打包到文件中,还是会报错:
Error loading Python lib '/xxx/xxx/dist/test/libpython2.7.so.1.0': /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /xxx/xxx/dist/test/libpython2.7.so.1.0)
也就是绕了一大圈,最后问题还是回到了原点,就是因为libpython2.7.so.1.0才导致了需要GLIBC_2.14的问题。
目前感觉无解。
参考文档和后续可能的解决方案:
1,使用系统自带的python2.6环境,安装对应的pyinstaller版本打包
可能存在python版本不兼容问题,目前测试看,python2.6 对应的pyinstaller版本为2.1,版本太旧,不支持在打包中添加配置文件。需要大规模修改代码
2,查看pyinstaller的更新记录可知他们在3.1以上的版本后不再为LSB构建引导加载程序,带来了这个问题https://github.com/pyinstaller/pyinstaller/issues/2369
3,编译python后可能还需要安装ssl模块,可以下载openssl-1.0.2d.tar.gz进行安装
4,高版本gcc编译出的程序在低版本glibc机器上运行 https://www.jianshu.com/p/77d7f7dc93b3
或许放弃对老版本的支持才是正确的道路,python官方都已经在2020年放弃支持python2.7,更何况2.6,旧版本的资料寻找不易,还是早点更新版本吧。




