Python是开发者常用的语言,各种Linux发布版本CentOS/Ubuntu等等,默认都会携带Python软件包发行。不过它们携带的Python是不能随意替换的。因为系统内置的包管理系统依赖它,如果直接替换很可能导致包管理系统瘫痪。

但是有时候就是需要特定版本的Python运行一些程序,那该如何处理呢?这个问题不难,早就有现成的解决方案。

自行编译模式

1、先安装必要的依赖库。这些是保证编译顺利必须的,但是不同系统略有区别。

以ubuntu为例:

sudo apt-get install -y build-essential checkinstall libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev zlib1g-dev openssl libffi-dev python3-dev python3-setuptools libncurses5-dev libreadline-dev liblzma-dev curl wget

2、选择使用直接编译模式,还是pyenv辅助程序。

如果选择直接编译,就直接运行configure/make即可,相关说明文档很多,不赘述了。不过这里说明一个参数,是从Python 3.6添加的,后来又加到Python 3.5/2.7。这个参数是:

--enable-optimizations

开启这个参数,可以提高python程序10%以上的执行速度!但是默认需要你自己开启编译参数,因为它会耗费数倍的编译时间,因为要进行测试,决定编译优化结果。如果编译时间不重要 – 它毕竟只编译执行一次,强烈建议打开此参数,生成最优的可执行代码。

相关说明参考:

Python Performance Boost by using Profile Guided Optimization

例子:

./configure --enable-optimizations

如果要自定义安装目录,需要加上–prefix:

./configure --prefix=/usr/local/python --enable-optimizations

然后:make

这里面有个要点是,如果你使用了默认的安装目录,默认在 /usr/bin下:

最后编译完成,安装时,不要直接:sudo make install

推荐方式是: sudo make altinstall

altinstall不会修改系统默认的python程序软链接,不会替换运行’python’命令指向的文件,所以就不会影响默认的python。

使用pyenv管理

pyenv的代码库在这里:https://github.com/pyenv/pyenv

自动安装脚本:

https://github.com/pyenv/pyenv-installer

使用自动安装脚本,直接运行:

curl https://pyenv.run | bash

不过最后还是要看一下提示,需要修改.bashrc的时候,要按照提示添加进去。

安装完毕,可以使用:

$ env PYTHON_CONFIGURE_OPTS="--enable-optimizations" pyenv install 3.6.8

env命令可以传递优化参数,并进行安装。

使用上面的参数,安装会耗费很长的时间,耐心等待。安装完毕后,记得运行一下:

pyenv rehash

pyenv的使用,可以参考具体文档,不在这里多说。

另外,这篇文档总结的更为全面,涉及各种OS环境:

https://realpython.com/installing-python/

如何构建更为有效、可靠的开发/部署环境,是个经久不衰的话题。因为技术在不断进步,应用场景在不断演化,各种“最佳实践”也是会改变的。后续还将讨论这个话题。

为什么你应该在项目中使用pyenv+Pipenv:为你的Python项目设置超棒的本地开发工作流之秘籍
如何排查Web服务器HTTP ERROR 500的错误?