在 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 && \
  tmpdir="$(mktemp -d)" && \
  cd "${tmpdir:?}" && \
    curl -fLO "https://www.python.org/ftp/python/${python_version:?}/Python-${python_version:?}.tar.xz" && \
    pv "Python-${python_version:?}.tar.xz" | xz -cdk - | tar -x && \
  mkdir -p "${HOME}/Applications/Python-${python_version:?}" && \
  cd "${tmpdir:?}/Python-${python_version:?}/" && \
    ./configure \
      --prefix="${HOME}/Applications/Python-${python_version:?}" \
      --enable-optimizations \
      --enable-loadable-sqlite-extensions && \
    make -j8 build_all && \
    echo "Compile process is finished, run command below to install." && \
    echo "  $ make -j8 altinstall"

3 安装

$ make -j8 altinstall

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