This page looks best with JavaScript enabled

ubuntu升级Python及pip

 ·  ☕ 4 min read · 👀... views

近日,笔者因为需要用到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

https://blog.csdn.net/shakeme/article/details/80911441

https://www.jianshu.com/p/fe9b5e266254

Share on

Qfrost
WRITTEN BY
Qfrost
CTFer, Anti-Cheater, LLVM Committer