在 Linux 发行版上编译并安装 Python3

1 准备

1.1 Debian/Ubuntu 系列环境

sudo apt update && \
sudo apt install -y \
  build-essential \
  bzip2 \
  curl \
  g++ \
  gcc \
  libbz2-dev \
  libdb-dev \
  libffi-dev \
  libgdbm-dev \
  liblzma-dev \
  libncurses5-dev \
  libnsl-dev \
  libnss3-dev \
  libreadline-dev \
  libsqlite3-dev \
  libssl-dev \
  libtirpc-dev \
  libzstd-dev \
  make \
  openssl \
  pkg-config \
  pv \
  python3-tk \
  tk-dev \
  xz-utils \
  zlib1g-dev \
&& echo 'OK'

1.2 RHEL/CentOS 系列环境

sudo yum install -y \
  bzip2-devel \
  curl \
  gcc \
  gcc-c++ \
  make \
  gdbm-devel \
  libffi-devel \
  libnsl2-devel \
  libuuid-devel \
  make \
  ncurses-devel \
  openssl-devel \
  pv \
  readline-devel \
  sqlite-devel \
  tk-devel \
  xz-devel \
  zlib-devel \
&& echo 'OK'

2 编译

指定要安装的版本:

export python_version='3.12.12'

下载源码并编译:

command -v -V curl && \
command -v -V make && \
command -v -V pv && \
command -v -V tar && \
command -v -V xz && \
workdir="$(pwd)" && \
curl "https://www.python.org/ftp/python/${python_version:?}/Python-${python_version:?}.tar.xz" \
  -fL \
  --create-dirs \
  --output "${workdir}/python-${python_version:?}-installer/Python-${python_version:?}.tar.xz" && \
(\
  cd "${workdir}/python-${python_version:?}-installer/" && \
  pv "Python-${python_version:?}.tar.xz" | xz -cdk - | tar -x \
) && \
(\
  cd "${workdir}/python-${python_version:?}-installer/Python-${python_version:?}" && \
  ./configure \
    --prefix="${workdir}/python-${python_version:?}" \
    --enable-optimizations \
    --enable-loadable-sqlite-extensions && \
  make -j8 build_all \
) && \
echo 'OK'

3 安装

workdir="$(pwd)" && \
(\
  cd "${workdir}/python-${python_version:?}-installer/Python-${python_version:?}" && \
  make -j8 altinstall \
) && \
echo "To use this Python version, add the following to your shell configuration:" && \
echo 'export PATH='"${workdir}"'/python-'"${python_version:?}"'/bin:${PATH}'

4 其他

4.1 配置国内更新源

if [ ! -f "${HOME}/.pip/pip.conf" ]; then \
mkdir -p "${HOME}/.pip/" && \
{ \
  echo '[global]' && \
  echo 'index-url = https://mirrors.huaweicloud.com/repository/pypi/simple' && \
  echo 'trusted-host = mirrors.huaweicloud.com' && \
  echo 'timeout = 120' && \
  true; } | tee "${HOME}/.pip/pip.conf"; \
else \
  echo '[WARN] ${HOME}/.pip/pip.conf: already exists'; \
fi
Author: ismdeep
License: Copyright (c) 2025 CC-BY-NC-4.0 LICENSE