u1timate
Published on 2025-01-21 / 16 Visits
0

从源码构建、编译和安装Python 3.13

转载链接 https://blog.frognew.com/2024/12/build-python3.13-from-source.html

构建需求

构建CPython所需的功能和最低版本要求如下:

  • C11编译器。不需要支持C11的可选功能

  • OpenSSL 的最低版本为1.1.1,推荐最低版本为3.0.9,用于sslhashlib扩展模块。

  • SQLite的最低版本为3.15.2,用于 sqlite3 扩展模块。

  • Tcl/Tk的最低版本为8.5.12,用于 tkinter 模块。

  • 重新生成configure脚本需要Autoconf 2.71和aclocal 1.16.5。

准备工作

安装依赖和构建工具

ubuntu

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev liblzma-dev tk-dev

CentOS7

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
yum clean all
yum makecache

yum install centos-release-scl-rh
sed -i 's#mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=7&repo=sclo-rh#\#mirrorlist=mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=7&repo=sclo-rh#g' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
sed -i 's#\#baseurl=http://mirror.centos.org/centos/7/sclo/$basearch/rh/#baseurl=https://mirrors.aliyun.com/centos/7/sclo/$basearch/rh/#g' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
yum clean all
yum makecache
yum install devtoolset-11-gcc devtoolset-11-gcc-c++ devtoolset-11-binutils
scl enable devtoolset-11 bash

编译安装新版openssl,要求3.0.9版本以上。

wget https://www.openssl.org/source/openssl-3.4.0.tar.gz

yum install -y perl perl-core perl-CPAN perl-IPC-Cmd
tar -zxvf openssl-3.4.0.tar.gz
cd openssl-3.4.0
./config --prefix=/usr/local/openssl-3.4.0
make -j4
make install
echo '/usr/local/openssl-3.4.0/lib64' > /etc/ld.so.conf.d/openssl-3.4.0.conf
# 更新动态链接库缓存
ldconfig -v

编译安装Python 3.13

ubuntu

cd ~
wget https://www.python.org/ftp/python/3.13.1/Python-3.13.1.tgz
tar xzf Python-3.13.1.tgz
cd Python-3.13.1
sudo ./configure --prefix=/usr/local/python-3.13 --enable-optimizations --with-lto --with-computed-gotos --with-system-ffi --enable-shared
sudo make -j "$(nproc)"
sudo ./python3.13 -m test -j "$(nproc)"
sudo make altinstall

CentOS7

yum install -y \
    openssl-devel \
    bzip2-devel \
    libffi-devel \
    zlib-devel \
    sqlite-devel \
    readline-devel \
    tk-devel \
    gdbm-devel \
    libpcap-devel \
    xz-devel

cd ~
wget https://www.python.org/ftp/python/3.13.1/Python-3.13.1.tgz
tar -xvzf Python-3.13.1.tgz
cd Python-3.13.1
export CFLAGS="-I/usr/local/openssl-3.4.0/include" 
export LDFLAGS="-L/usr/local/openssl-3.4.0/lib64"
export PKG_CONFIG_PATH="/usr/local/openssl-3.4.0/lib64/pkgconfig:/usr/lib64/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="/usr/local/openssl-3.4.0/lib64:$LD_LIBRARY_PATH"

./configure --prefix=/usr/local/python-3.13 \
  --enable-optimizations \
  --enable-shared \
  --with-ensurepip=upgrade \
  --with-lto \
  --with-computed-gotos \
  --enable-loadable-sqlite-extensions \
  --with-pkg-config=yes \
  --with-openssl=/usr/local/openssl-3.4.0

scl enable devtoolset-11 bash
make -j4
make altinstall

echo '/usr/local/python-3.13/lib' > /etc/ld.so.conf.d/python3.13.conf
# 更新动态链接库缓存
ldconfig -v

验证安装

/usr/local/python-3.13/bin/python3.13 --version
Python 3.13.1

/usr/local/python-3.13/bin/python3.13
>>> import sys
>>> print(sys.platform)
linux
>>> print(sys.implementation.name)
cpython
>>> print(sys.version_info)
sys.version_info(major=3, minor=13, micro=1, releaselevel='final', serial=0)
>>> print(sys.version)
3.13.1 (main) [GCC 11.2.1 20220127 (Red Hat 11.2.1-9)]