近日,笔者因为需要用到aiohttp异步处理库,而需要对服务器的Python版本做一个升级。本以为是很简单的一个事情,没想到这个升级还真不是一般的难升…因为网上的教程几乎全都是centos的,所以在这里,我分享一下我用ubuntu升级python的踩坑之旅。
首先装一下zlib库,这在编译python源码时需要用到。
apt-get install ruby
apt-get install zlib1g
apt-get install zlib1g.dev
然后去python的官网下载最新版的python源码包并解压。
wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz
tar -xzvf Python-3.7.2.tgz
mkdir /usr/local/python3
然后生成Makefile文件。可以通过在 configure 后加上参数来对安装进行控制,比如下面就是指定安装目录/usr/local/python3。如果没有用这个选项,安装过程结束后,该软件所需的软件被复制到不同的系统目录下,比较混乱。
cd Python-3.7.2
./configure --enable-optimizations --prefix=/usr/local/python3
然后根据常规编译代码,注意,因为我们要保留之前的python版本,所以要用"make altinstall",altinstall在安装时会区分已存在版本。
make && make altinstall
如果 在make过程中出现 error ,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交 bugreport(一般在 INSTALL 里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。
然后,经过一个漫长的等待过程,安装是安装完了,但是它报错了….
我们可以看到,两个模块编译失败,分别是_ctypes和ssl
笔者先研究了_ctypes模块编译不成功的原因,因为笔者发现,缺少了这个模块,不管装什么库都要报错:ModuleNotFoundError: No module named ‘_ctypes’ 查了一些资料发现,这个库用于python代码与c代码混编时使用,编译失败是因为缺少了libffi-devel库。
因此如果你是CentOS,运行
yum install libffi-devel
如果是ubuntu则
apt-get install libffi-dev
成功安装依赖后再从config开始重新安装即可解决。
而对于_ssl模块笔者测试后发现只有少数模块在调用时会用到它,但为了不给未来留下隐患,笔者也去研究了下,发现还是因为缺少依赖库。
apt-get install libssl-dev
成功安装依赖后再从config开始重新安装也可解决此问题。
编译python过程中还会有类似很多的问题,但大都是因为缺少依赖库,所以在这里,对依赖库及ubuntu下安装他们的方法做一个汇总,若是各位在编译过程中出现问题,请务必先检查有没有少库。
sudo apt-get install gcc make zlib1g-dev #编译安装过程需要的库
sudo apt-get install libbz2-dev #bz2支持库,若在编译安装python前没有安装,将无法通过 pip install 安装提供bz2格式的第三方库
apt-get install libsqlite3-dev #sqlite3支持库,若缺少此模块引入sqlite3或使用依赖sqllite3的第三方库(例如Scrapy)时,会出现ImportError: No modul named _sqllite3的错误
sudo apt-get install python3-dev libxml2-dev libffi-dev libssl-dev libxslt1-dev #安装第三方库需要的库
Nice!如果你也看到这样的提示,那说明安装成功了,接下来清理中间文件并建立软连接,以确保我们执行’python3’命令的时候打开的是新版的python
make clean
ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3.7 /usr/bin/pip3
可以看到,我们成功将python和pip一起升级到了3.7。然后随便装个库试下,却报错了….
查了资料后很多人的观点是删掉/usr/bin/lsb_release文件,笔者测试后发现这样确实可以解决问题,但是lsb是linux系统提供的一个二进制接口,贸然删除它可能会给未来会留下隐患。但是笔者查遍了全网的资料却没能找到一个合适的方法,若是各位朋友找到了合适的方法,欢迎联系 Mail:root@qfrost.com 与我交流。
find / -name lsb_release
rm -rf /usr/bin/lsb_release
这样,我们就成功为ubuntu系统升级了Python和pip,但是建议各位不要卸载原python(特别是系统自带的版本),笔者将自带的Python3.5卸载后发现数据库连不上了,一切都得从头来过….教程到此结束。
参考资料:https://www.cnblogs.com/momolei/p/9895218.html
https://www.cnblogs.com/longbigbeard/p/10028746.html
https://bugs.python.org/issue34385