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/
如何构建更为有效、可靠的开发/部署环境,是个经久不衰的话题。因为技术在不断进步,应用场景在不断演化,各种“最佳实践”也是会改变的。后续还将讨论这个话题。
这个工具确实还是不错的,推荐安装。