离线环境编译安装 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 的完整流程:
- 准备工作 - 在有网络的机器上下载 Python 源码和所有依赖库
- 编译依赖 - 依次编译安装 zlib、OpenSSL、bzip2、xz、libffi、ncurses、readline、sqlite 等
- 编译 Python - 配置正确的路径,启用优化选项
- 配置环境 - 设置 PATH、LD_LIBRARY_PATH 等环境变量
- 离线 pip - 准备 wheel 包,配置本地源
离线环境部署的关键点:
- ✅ 提前准备好所有依赖库的源码
- ✅ 正确设置 CPPFLAGS 和 LDFLAGS
- ✅ 配置 LD_LIBRARY_PATH 或 ld.so.conf
- ✅ 准备 wheel 包用于离线 pip 安装
- ✅ 不要覆盖系统自带的 Python
这种部署方式虽然繁琐,但能确保在生产环境中的稳定性和安全性。🚀
注:本文基于 Python 3.10.13 编写。如果你使用的是其他版本,下载链接和文件名需要相应调整。建议在生产环境部署前先在测试环境验证。







