编译安装
Linux下编译安装大多数软件的过程,主要分为几个步骤:
- 安装编译器和各种依赖
- 下载源码并解压
- 通过configure配置编译安装的参数
- make && make install
- 将编译出来的二进制文件添加到环境变量
手动编译
详细记录在Linux上编译安装指定版本Python解释器的过程和可能遇到的问题,及多个Python版本并存的使用方法。
安装编译工具和依赖包
在正式开始之前,建议首先检查系统软件是否均为最新,并更新到最新版本,然后安装必须得依赖软件。
Ubuntu
sudo apt install -y gcc build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libbz2-dev liblzma-dev sqlite3 libsqlite3-dev tk-dev uuid-dev libgdbm-compat-dev
Centos
yum -y install wget xz tar gcc make tk-devel sqlite-devel zlib-devel readline-devel openssl-devel curl-devel tk-devel gdbm-devel xz-devel bzip2-devel
下载源代码
可通过 wget
下载:
# 下载 Python 3.9.12
sudo wget https://registry.npmmirror.com/-/binary/python/3.9.12/Python-3.9.12.tar.xz /opt
# 下载其他版本只需替换版本号数字
解压并进入该目录,后续的所有命令均在该目录中执行:
# 解压
tar -xf Python-3.9.12.tar.xz
# 进入该目录
cd Python-3.9.12/
配置
# 检查依赖与配置编译
sudo ./configure --enable-optimizations --with-lto --enable-shared
此处使用了三个可选配置项,含义如下:
- --enable-optimizations:用 PROFILE_TASK 启用以配置文件主导的优化(PGO)
- --with-lto:在编译过程中启用链接时间优化(LTO)
- --enable-shared:启用共享 Python 库 libpython 的编译
更多可用配置项的信息,请参阅 Python 官方文档。
经过一系列检查无误之后,会自动生成 Makefile,即可进行下一步的编译了。
编译
完成配置,生成 Makefile 后,就可以开始编译了。编译耗时较长,可以使用 -j
选项指定参与编译的 CPU 核心数,例如此机器为 8 核 CPU:
# 编译,-j 后面的数字为参与编译的CPU核心数,根据个人机器配置调整
sudo make -j 8
编译结束后,注意仔细查看一下输出,检查可能存在的错误:
# 一种可能出现的问题:
$ sudo make
# ......省略部分输出......
Python build finished successfully!
The necessary bits to build these optional modules were not found:
_dbm _tkinter _uuid
To find the necessary bits, look in setup.py in detect_modules() for the module's name.
如果出现类似如上的警告,说明编译时有部分软件包不可用,导致编译出的 Python 有部分可选模块不可用。检查上一节中提到的依赖是否都已安装,或求助于网络搜索引擎,安装对应软件包后再次编译即可。
安装
# 安装二进制文件
sudo make altinstall
在 Makefile 中有如下提示:
If you have a previous version of Python installed that you don't want to overwrite, you can use "make altinstall" instead of "make install".
故应使用 altinstall
而不是 install
。二者的一个重要区别在于,后者会创建符号链接,将 python3
等命令链接到正在安装的新版本 Python 3 上,这可能会破坏系统。更多信息请参阅当前目录下的 README.rst
文件。
链接动态库
由于编译配置中有 --enable-shared
的选项,故此时直接使用命令 python3.9
会提示无法找到 libpython3.9.so.1.0
的错误。只需找到该 so
文件,复制(或创建符号链接)到 /usr/lib/
目录下即可:
# 找到 libpython 的位置
$ whereis libpython3.9.so.1.0
libpython3.9.so.1: /usr/local/lib/libpython3.9.so.1.0
# 在 /usr/lib/ 下创建 libpython 的符号链接
$ sudo ln -s /usr/local/lib/libpython3.9.so.1.0 /usr/lib/
使用 Python 3.9
完成安装后,Python 3.9 会与系统原有的 Python3 共存。由于 Ubuntu 系统、安装的其他软件等很可能会依赖于系统原有的python3,所以不要移除原有Python 环境,也不要对 python3
等命令进行修改。
直接在命令行使用 python3.9
命令即可调用新安装的解释器:
# 在命令行使用 Python 交互式解释器
$ python3.9
Python 3.9.12 (main, Apr 22 2022, 18:58:57)
[GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
# 查看该命令所在位置
$ which python3.9
/usr/local/bin/python3.9
类似的,使用 Python 3.9 的 pip
的命令为 pip3.9
# 查看 pip3.9 版本
$ pip3.9 -V
pip 22.0.4 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)