离线环境编译安装 Python 3.10 完整教程 - 无网络服务器部署指南

前言

在生产环境中,很多服务器出于安全考虑被部署在隔离网络中,无法直接访问互联网下载依赖包。本文详细介绍如何在完全离线的环境下编译安装 Python 3.10,包括所有依赖库的准备、编译配置和常见问题解决。

官方文档https://docs.python.org/3.10/

下载地址https://www.python.org/downloads/

目标版本:Python 3.10.x

适用场景:内网服务器、隔离环境、生产环境部署

一、环境准备

1.1 系统要求

# 支持的操作系统
- CentOS 7.x / 8.x / 9.x
- RHEL 7.x / 8.x / 9.x
- Ubuntu 16.04 / 18.04 / 20.04 / 22.04
- Debian 9 / 10 / 11
- openSUSE 15.x
- SUSE Linux Enterprise

# 最低配置
- CPU: 双核
- 内存:2GB
- 磁盘空间:5GB 可用空间

# 推荐配置
- CPU: 四核或更多
- 内存:4GB 或更多
- 磁盘空间:10GB 可用空间

1.2 检查现有 Python 版本

# 检查系统自带的 Python
python --version
python2 --version
python3 --version

# 检查 Python 路径
which python
which python2
which python3

# CentOS/RHEL 通常自带 Python 2.7
# Ubuntu/Debian 通常自带 Python 3.x

# 重要:不要删除系统自带的 Python!
# 很多系统工具依赖它

二、离线准备工作(在有网络的机器上)

2.1 下载 Python 源码

# 在有网络的机器上操作
mkdir -p ~/python-offline
cd ~/python-offline

# 下载 Python 3.10.13 源码(最新 3.10 版本)
wget https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz

# 验证 SHA256 校验和
wget https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz.sha256
sha256sum -c Python-3.10.13.tgz.sha256

# 预期输出:Python-3.10.13.tgz: OK

2.2 下载所有依赖库源码

Python 编译需要多个依赖库,在离线环境下需要提前准备好:

cd ~/python-offline

# 创建依赖库目录
mkdir -p deps
cd deps

# 1. OpenSSL(用于 HTTPS/SSL 支持)
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz

# 2. zlib(压缩库)
wget https://zlib.net/zlib-1.3.1.tar.gz

# 3. bzip2(压缩库)
wget https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz

# 4. xz(压缩库)
wget https://tukaani.org/xz/xz-5.4.5.tar.gz

# 5. libffi(外部函数接口)
wget https://github.com/libffi/libffi/releases/download/v3.4.4/libffi-3.4.4.tar.gz

# 6. ncurses(终端 UI 库)
wget https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.4.tar.gz

# 7. readline(命令行编辑)
wget https://ftp.gnu.org/pub/gnu/readline/readline-8.2.tar.gz

# 8. sqlite(数据库)
wget https://www.sqlite.org/2023/sqlite-autoconf-3430200.tar.gz

# 9. tk(GUI 支持,可选)
wget https://prdownloads.sourceforge.net/tcl/tk8.6.13-src.tar.gz

# 10. gdbm(数据库,可选)
wget https://ftp.gnu.org/gnu/gdbm/gdbm-1.23.tar.gz

2.3 一键下载脚本

#!/bin/bash
# download_python_deps.sh
# 一键下载所有依赖

mkdir -p ~/python-offline/deps
cd ~/python-offline

# Python 源码
wget https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz

# 依赖库
cd deps

# OpenSSL
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz

# zlib
wget https://zlib.net/zlib-1.3.1.tar.gz

# bzip2
wget https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz

# xz
wget https://tukaani.org/xz/xz-5.4.5.tar.gz

# libffi
wget https://github.com/libffi/libffi/releases/download/v3.4.4/libffi-3.4.4.tar.gz

# ncurses
wget https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.4.tar.gz

# readline
wget https://ftp.gnu.org/pub/gnu/readline/readline-8.2.tar.gz

# sqlite
wget https://www.sqlite.org/2023/sqlite-autoconf-3430200.tar.gz

# tk (可选)
wget https://prdownloads.sourceforge.net/tcl/tk8.6.13-src.tar.gz

# gdbm (可选)
wget https://ftp.gnu.org/gnu/gdbm/gdbm-1.23.tar.gz

echo "所有文件下载完成!"
ls -lh

2.4 打包离线文件

cd ~/python-offline

# 打包所有文件
tar -czf python-3.10-offline.tar.gz     Python-3.10.13.tgz     deps/

# 验证包大小
ls -lh python-3.10-offline.tar.gz

# 可选:创建校验和
sha256sum python-3.10-offline.tar.gz > python-3.10-offline.tar.gz.sha256

# 传输到离线服务器
# 使用 scp、U 盘、或其他方式传输
scp python-3.10-offline.tar.gz user@offline-server:/tmp/

三、离线服务器安装

3.1 安装基础编译工具

离线服务器至少需要有基础编译工具。如果完全没有,需要先通过其他方式安装:

# CentOS/RHEL - 如果有本地 yum 源
sudo yum groupinstall -y "Development Tools"
sudo yum install -y gcc gcc-c++ make

# Ubuntu/Debian - 如果有本地 apt 源
sudo apt-get update
sudo apt-get install -y build-essential

# 如果完全没有包管理器,需要离线安装以下 RPM/DEB 包:
# - gcc
# - gcc-c++
# - make
# - binutils

3.2 解压文件

# 创建工作目录
mkdir -p /opt/python-build
cd /opt/python-build

# 解压离线包
tar -xzf /tmp/python-3.10-offline.tar.gz

# 验证文件
ls -lh
# 应该看到 Python-3.10.13.tgz 和 deps/ 目录

四、编译依赖库

4.1 设置安装目录

# 定义安装路径
export PYTHON_INSTALL_DIR=/opt/python-3.10
export DEPS_INSTALL_DIR=/opt/deps

# 创建目录
sudo mkdir -p $PYTHON_INSTALL_DIR
sudo mkdir -p $DEPS_INSTALL_DIR
sudo chown $USER:$USER $PYTHON_INSTALL_DIR
sudo chown $USER:$USER $DEPS_INSTALL_DIR

4.2 编译安装 zlib

cd /opt/python-build/deps
tar -xzf zlib-1.3.1.tar.gz
cd zlib-1.3.1

# 配置
./configure --prefix=$DEPS_INSTALL_DIR/zlib

# 编译安装
make -j$(nproc)
make install

echo "zlib 安装完成"

4.3 编译安装 OpenSSL

cd /opt/python-build/deps
tar -xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w

# 配置(不使用汇编加速,提高兼容性)
./config --prefix=$DEPS_INSTALL_DIR/openssl     --openssldir=$DEPS_INSTALL_DIR/openssl/ssl     no-asm     shared

# 编译安装
make -j$(nproc)
make install

echo "OpenSSL 安装完成"

4.4 编译安装 bzip2

cd /opt/python-build/deps
tar -xzf bzip2-1.0.8.tar.gz
cd bzip2-1.0.8

# 编译
make -j$(nproc)

# 安装(bzip2 没有标准 configure)
make install PREFIX=$DEPS_INSTALL_DIR/bzip2

echo "bzip2 安装完成"

4.5 编译安装 xz

cd /opt/python-build/deps
tar -xzf xz-5.4.5.tar.gz
cd xz-5.4.5

# 配置
./configure --prefix=$DEPS_INSTALL_DIR/xz

# 编译安装
make -j$(nproc)
make install

echo "xz 安装完成"

4.6 编译安装 libffi

cd /opt/python-build/deps
tar -xzf libffi-3.4.4.tar.gz
cd libffi-3.4.4

# 配置
./configure --prefix=$DEPS_INSTALL_DIR/libffi

# 编译安装
make -j$(nproc)
make install

echo "libffi 安装完成"

4.7 编译安装 ncurses

cd /opt/python-build/deps
tar -xzf ncurses-6.4.tar.gz
cd ncurses-6.4

# 配置
./configure --prefix=$DEPS_INSTALL_DIR/ncurses     --with-shared     --with-normal     --without-debug

# 编译安装
make -j$(nproc)
make install

echo "ncurses 安装完成"

4.8 编译安装 readline

cd /opt/python-build/deps
tar -xzf readline-8.2.tar.gz
cd readline-8.2

# 配置
./configure --prefix=$DEPS_INSTALL_DIR/readline

# 编译安装
make -j$(nproc)
make install

echo "readline 安装完成"

4.9 编译安装 sqlite

cd /opt/python-build/deps
tar -xzf sqlite-autoconf-3430200.tar.gz
cd sqlite-autoconf-3430200

# 配置
./configure --prefix=$DEPS_INSTALL_DIR/sqlite

# 编译安装
make -j$(nproc)
make install

echo "sqlite 安装完成"

4.10 编译安装 gdbm(可选)

cd /opt/python-build/deps
tar -xzf gdbm-1.23.tar.gz
cd gdbm-1.23

# 配置
./configure --prefix=$DEPS_INSTALL_DIR/gdbm     --enable-libgdbm-compat

# 编译安装
make -j$(nproc)
make install

echo "gdbm 安装完成"

4.11 编译安装 tk(可选,GUI 支持)

# 首先需要安装 tcl
cd /opt/python-build/deps
wget https://prdownloads.sourceforge.net/tcl/tcl8.6.13-src.tar.gz
tar -xzf tcl8.6.13-src.tar.gz
cd tcl8.6.13/unix

# 编译安装 tcl
./configure --prefix=$DEPS_INSTALL_DIR/tcl
make -j$(nproc)
make install

# 编译安装 tk
cd ../../tk8.6.13/unix
./configure --prefix=$DEPS_INSTALL_DIR/tk
make -j$(nproc)
make install

echo "tk 安装完成"

五、编译安装 Python 3.10

5.1 解压 Python 源码

cd /opt/python-build
tar -xzf Python-3.10.13.tgz
cd Python-3.10.13

5.2 配置编译选项

# 设置环境变量,指定依赖库路径
export CPPFLAGS="-I$DEPS_INSTALL_DIR/zlib/include     -I$DEPS_INSTALL_DIR/openssl/include     -I$DEPS_INSTALL_DIR/bzip2/include     -I$DEPS_INSTALL_DIR/xz/include     -I$DEPS_INSTALL_DIR/libffi/include     -I$DEPS_INSTALL_DIR/ncurses/include     -I$DEPS_INSTALL_DIR/readline/include     -I$DEPS_INSTALL_DIR/sqlite/include     -I$DEPS_INSTALL_DIR/gdbm/include"

export LDFLAGS="-L$DEPS_INSTALL_DIR/zlib/lib     -L$DEPS_INSTALL_DIR/openssl/lib     -L$DEPS_INSTALL_DIR/bzip2/lib     -L$DEPS_INSTALL_DIR/xz/lib     -L$DEPS_INSTALL_DIR/libffi/lib     -L$DEPS_INSTALL_DIR/ncurses/lib     -L$DEPS_INSTALL_DIR/readline/lib     -L$DEPS_INSTALL_DIR/sqlite/lib     -L$DEPS_INSTALL_DIR/gdbm/lib"

export LD_LIBRARY_PATH="$DEPS_INSTALL_DIR/zlib/lib:    $DEPS_INSTALL_DIR/openssl/lib:    $DEPS_INSTALL_DIR/bzip2/lib:    $DEPS_INSTALL_DIR/xz/lib:    $DEPS_INSTALL_DIR/libffi/lib:    $DEPS_INSTALL_DIR/ncurses/lib:    $DEPS_INSTALL_DIR/readline/lib:    $DEPS_INSTALL_DIR/sqlite/lib:    $DEPS_INSTALL_DIR/gdbm/lib"

export PKG_CONFIG_PATH="$DEPS_INSTALL_DIR/zlib/lib/pkgconfig:    $DEPS_INSTALL_DIR/openssl/lib/pkgconfig:    $DEPS_INSTALL_DIR/libffi/lib/pkgconfig"

# 配置 Python
./configure --prefix=$PYTHON_INSTALL_DIR     --enable-optimizations     --with-lto     --with-ensurepip=install     --with-system-openssl     --with-zlib-dir=$DEPS_INSTALL_DIR/zlib     --with-bzip2=$DEPS_INSTALL_DIR/bzip2     --with-dbmliborder=gdbm:ndbm:bdb     CPPFLAGS="$CPPFLAGS"     LDFLAGS="$LDFLAGS"
# 如果依赖是使用apt安装使用如下方式编译

# 配置选项说明: # --prefix 安装目录 # --enable-optimizations 启用 PGO 优化(编译更慢但运行更快) # --with-lto 启用链接时优化 # --with-ensurepip 安装 pip # --with-system-openssl 使用系统 OpenSSL # --with-zlib-dir 指定 zlib 路径 # --with-bzip2 指定 bzip2 路径 # --with-dbmliborder 指定数据库库顺序

上面报错使用如下方法编译

 

5.3 编译安装

# 编译(启用优化后比较慢)
make -j$(nproc)

# 编译时间参考:
# - 双核 CPU:约 20-30 分钟
# - 四核 CPU:约 10-15 分钟
# - 八核 CPU:约 5-8 分钟

# 安装
sudo make install

# 或者安装到 altinstall(避免覆盖系统 Python)
sudo make altinstall

5.4 验证安装

# 验证 Python 版本
$PYTHON_INSTALL_DIR/bin/python3.10 --version

# 预期输出:Python 3.10.13

# 验证 pip
$PYTHON_INSTALL_DIR/bin/pip3.10 --version

# 验证 SSL 支持
$PYTHON_INSTALL_DIR/bin/python3.10 -c "import ssl; print(ssl.OPENSSL_VERSION)"

# 验证 sqlite 支持
$PYTHON_INSTALL_DIR/bin/python3.10 -c "import sqlite3; print(sqlite3.sqlite_version)"

# 验证 zlib 支持
$PYTHON_INSTALL_DIR/bin/python3.10 -c "import zlib; print('zlib OK')"

# 验证 readline 支持
$PYTHON_INSTALL_DIR/bin/python3.10 -c "import readline; print('readline OK')"

六、配置系统路径

6.1 方法一:创建符号链接

# 创建符号链接(不覆盖系统 Python)
sudo ln -s $PYTHON_INSTALL_DIR/bin/python3.10 /usr/local/bin/python3.10
sudo ln -s $PYTHON_INSTALL_DIR/bin/pip3.10 /usr/local/bin/pip3.10

# 验证
python3.10 --version
pip3.10 --version

6.2 方法二:修改 PATH 环境变量

# 添加到 ~/.bashrc 或 ~/.profile
echo 'export PATH=$PYTHON_INSTALL_DIR/bin:$PATH' >> ~/.bashrc

# 使配置生效
source ~/.bashrc

# 验证
python3.10 --version
which python3.10

6.3 方法三:使用 update-alternatives(Debian/Ubuntu)

# 注册 Python 3.10
sudo update-alternatives --install /usr/bin/python3 python3     $PYTHON_INSTALL_DIR/bin/python3.10 2

# 注册 pip
sudo update-alternatives --install /usr/bin/pip3 pip3     $PYTHON_INSTALL_DIR/bin/pip3.10 2

# 选择默认版本
sudo update-alternatives --config python3

6.4 配置库文件路径

# 添加库文件路径到 ld.so.conf
echo "$DEPS_INSTALL_DIR/zlib/lib" | sudo tee /etc/ld.so.conf.d/python-deps.conf
echo "$DEPS_INSTALL_DIR/openssl/lib" | sudo tee -a /etc/ld.so.conf.d/python-deps.conf
echo "$DEPS_INSTALL_DIR/libffi/lib" | sudo tee -a /etc/ld.so.conf.d/python-deps.conf

# 更新动态链接库缓存
sudo ldconfig

# 验证
ldconfig -p | grep -E "zlib|ssl|ffi"

七、测试 Python 功能

7.1 创建测试脚本

cat > ~/test_python.py << 'EOF'
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Python 3.10 功能测试"""

import sys
import ssl
import sqlite3
import zlib
import bz2
import lzma
import hashlib
import json
import urllib.request

print("=" * 50)
print("Python 3.10 功能测试")
print("=" * 50)

# 版本信息
print(f"
1. Python 版本:{sys.version}")

# SSL 测试
print(f"
2. OpenSSL 版本:{ssl.OPENSSL_VERSION}")

# SQLite 测试
print(f"
3. SQLite 版本:{sqlite3.sqlite_version}")

# 压缩库测试
print(f"
4. zlib 版本:{zlib.ZLIB_VERSION}")
print(f"   bz2 支持:OK")
print(f"   lzma 版本:{lzma.LZMA_VERSION_STRING}")

# 哈希测试
test_hash = hashlib.sha256(b"test").hexdigest()
print(f"
5. SHA256 测试:{test_hash}")

# JSON 测试
data = {"name": "test", "version": 3.10}
json_str = json.dumps(data, ensure_ascii=False)
print(f"
6. JSON 测试:{json_str}")

# 模式匹配测试(Python 3.10 新特性)
def http_status(status):
    match status:
        case 200:
            return "OK"
        case 404:
            return "Not Found"
        case 500:
            return "Server Error"
        case _:
            return "Unknown"

print(f"
7. 模式匹配测试:")
print(f"   200 -> {http_status(200)}")
print(f"   404 -> {http_status(404)}")
print(f"   500 -> {http_status(500)}")

# 海象运算符测试(Python 3.8+,3.10 支持)
print(f"
8. 海象运算符测试:")
if (n := len([1, 2, 3, 4, 5])) > 3:
    print(f"   列表长度 {n} 大于 3")

# 类型提示改进测试
print(f"
9. 类型提示测试:")
def greet(name: str) -> str:
    return f"Hello, {name}!"
print(f"   {greet('Python 3.10')}")

print("
" + "=" * 50)
print("所有测试通过!✅")
print("=" * 50)
EOF

# 运行测试
python3.10 ~/test_python.py

7.2 测试 pip 安装包

# 测试 pip 安装(离线环境需要 wheel 包)
python3.10 -m pip install --upgrade pip

# 安装 requests(需要先下载 wheel 包)
# 在有网络的机器上下载:
# pip download requests -d ~/python-wheels

# 在离线服务器上安装:
# python3.10 -m pip install --no-index --find-links=~/python-wheels requests

# 验证安装
python3.10 -c "import requests; print('requests 安装成功')"

八、离线 pip 包管理

8.1 在有网络的机器上准备 wheel 包

# 创建 wheel 包下载目录
mkdir -p ~/python-wheels
cd ~/python-wheels

# 下载常用包及其依赖
pip download requests -d ./requests
pip download numpy -d ./numpy
pip download pandas -d ./pandas
pip download flask -d ./flask
pip download django -d ./django
pip download sqlalchemy -d ./sqlalchemy
pip download pytest -d ./pytest

# 或者下载 requirements.txt 中的所有包
# pip download -r requirements.txt -d ./all-packages

# 打包
tar -czf python-wheels.tar.gz requests numpy pandas flask django

# 传输到离线服务器
scp python-wheels.tar.gz user@offline-server:/tmp/

8.2 在离线服务器上安装

# 解压 wheel 包
cd /opt
tar -xzf /tmp/python-wheels.tar.gz

# 创建本地 pip 索引
mkdir -p /opt/pypi

# 配置 pip 使用本地源
mkdir -p ~/.pip
cat > ~/.pip/pip.conf << EOF

[global]

index-url = file:///opt/pypi trusted-host = localhost

[install]

no-index = false find-links = /opt/requests /opt/numpy /opt/pandas EOF # 安装包 python3.10 -m pip install requests python3.10 -m pip install numpy # 或者直接从目录安装 python3.10 -m pip install --no-index --find-links=/opt/requests requests

8.3 创建本地 PyPI 镜像(可选)

# 安装 pypiserver
python3.10 -m pip install --no-index --find-links=/opt/pypi pypiserver

# 创建包仓库
mkdir -p /opt/pypi-packages
cp /opt/*/*.whl /opt/pypi-packages/

# 启动 pypiserver
python3.10 -m pypiserver run -p 8080 -P . -a . /opt/pypi-packages &

# 配置 pip 使用本地服务器
cat > ~/.pip/pip.conf << EOF

[global]

index-url = http://localhost:8080/simple/ trusted-host = localhost EOF # 安装包 python3.10 -m pip install requests

九、常见问题

9.1 编译错误:找不到 OpenSSL

# 确保 OpenSSL 已正确编译安装
ls $DEPS_INSTALL_DIR/openssl/include/openssl/ssl.h

# 检查环境变量
echo $CPPFLAGS
echo $LDFLAGS

# 重新配置 Python,使用系统openssl
./configure --prefix=/opt/python-3.10 \
    --enable-optimizations \
    --without-lto \
    --with-openssl=/usr \
    CPPFLAGS="-I/usr/include" \
    LDFLAGS="-L/usr/lib64 -lssl -lcrypto"

make -j$(nproc)
sudo make install

9.2 运行时错误:libffi.so 找不到

# 添加库路径到 ld.so.conf
echo "$DEPS_INSTALL_DIR/libffi/lib" | sudo tee /etc/ld.so.conf.d/libffi.conf
sudo ldconfig

# 或者设置 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$DEPS_INSTALL_DIR/libffi/lib:$LD_LIBRARY_PATH

# 验证
ldconfig -p | grep libffi

9.3 pip 安装失败:SSL 证书验证失败

# 离线环境使用本地 wheel 包
python3.10 -m pip install --no-index --find-links=/opt/wheels 包名

# 或者禁用 SSL 验证(仅限内网)
python3.10 -m pip install --trusted-host pypi.org 包名

9.4 编译时间过长

# 禁用 PGO 优化(编译快但运行稍慢)
./configure --prefix=$PYTHON_INSTALL_DIR     --without-lto     # 去掉 --enable-optimizations

# 减少并行编译的核心数(避免内存不足)
make -j2

9.5 模块导入失败

# 检查模块是否编译成功
python3.10 -m sysconfig

# 查看缺失的模块
python3.10 -c "import sys; print('
'.join(sys.builtin_module_names))"

# 查看 Modules/Setup 文件,确认模块配置
cat Modules/Setup | grep -v "^#"

# 重新配置并编译
make clean
./configure [选项]
make -j$(nproc)
sudo make install

十、卸载方法

# 删除安装目录
sudo rm -rf $PYTHON_INSTALL_DIR
sudo rm -rf $DEPS_INSTALL_DIR

# 删除符号链接
sudo rm /usr/local/bin/python3.10
sudo rm /usr/local/bin/pip3.10

# 清理环境变量
# 编辑 ~/.bashrc,删除相关行
sed -i '/python-3.10/d' ~/.bashrc
sed -i '/DEPS_INSTALL_DIR/d' ~/.bashrc
source ~/.bashrc

# 清理构建目录
sudo rm -rf /opt/python-build

总结

通过本文,你应该已经掌握了在离线环境下编译安装 Python 3.10 的完整流程:

  1. 准备工作 - 在有网络的机器上下载 Python 源码和所有依赖库
  2. 编译依赖 - 依次编译安装 zlib、OpenSSL、bzip2、xz、libffi、ncurses、readline、sqlite 等
  3. 编译 Python - 配置正确的路径,启用优化选项
  4. 配置环境 - 设置 PATH、LD_LIBRARY_PATH 等环境变量
  5. 离线 pip - 准备 wheel 包,配置本地源

离线环境部署的关键点:

  • ✅ 提前准备好所有依赖库的源码
  • ✅ 正确设置 CPPFLAGS 和 LDFLAGS
  • ✅ 配置 LD_LIBRARY_PATH 或 ld.so.conf
  • ✅ 准备 wheel 包用于离线 pip 安装
  • ✅ 不要覆盖系统自带的 Python

这种部署方式虽然繁琐,但能确保在生产环境中的稳定性和安全性。🚀


注:本文基于 Python 3.10.13 编写。如果你使用的是其他版本,下载链接和文件名需要相应调整。建议在生产环境部署前先在测试环境验证。

发表回复

后才能评论