【CentOS7】CentOS 7 编译安装 Python 3.11.9

Python 3.11 pip 无 SSL 模块问题:使用 OpenSSL 3.0.13 重新编译 Python

注意:以下操作最好在测试机试验一遍

一、问题原因分析(为什么 pip 会缺 SSL?)

Python 的 ssl 模块并不是纯 Python 实现,而是:

  • 编译时依赖系统中的 OpenSSL

  • 如果在 ./configure 阶段:

    • 找不到 openssl/ssl.h
    • 或 OpenSSL 版本不兼容
  • 那么:

    • _ssl.so 不会被编译
    • import ssl 会失败
    • pip 无法访问 HTTPS

📌 Python 3.11 推荐使用 OpenSSL ≥ 1.1.1(3.0.x 完全支持)


三、解决思路总览

我们的解决方案分为 5 步:

  1. 安装并准备 OpenSSL 3.0.13
  2. 清理 Python 旧的编译残留
  3. 使用 --with-openssl 明确指定 OpenSSL 路径
  4. 验证 _ssl 模块是否成功生成
  5. 验证 ssl / pip 是否可用

四、完整自动化编译脚本(推荐)

⚠️ 假设:

  • OpenSSL 安装在:/usr/local/openssl-3.0.13
  • Python 源码在:/usr/local/src/Python-3.11.9

🔧 一键编译脚本

bash 复制代码
#!/bin/bash
set -e

echo "=== 开始重新编译 Python 3.11.9 with OpenSSL 3.0.13 ==="

cd /usr/local/src/Python-3.11.9

# 清理
echo "清理之前的编译..."
sudo make distclean 2>/dev/null || true

# 设置环境变量
export OPENSSL_DIR="/usr/local/openssl-3.0.13"
export LDFLAGS="-L${OPENSSL_DIR}/lib64"
export CPPFLAGS="-I${OPENSSL_DIR}/include"
export LD_LIBRARY_PATH="${OPENSSL_DIR}/lib64:$LD_LIBRARY_PATH"
export PKG_CONFIG_PATH="${OPENSSL_DIR}/lib64/pkgconfig"

echo "配置 Python..."
sudo -E ./configure \
    --prefix=/usr/local/python3.11.9 \
    --with-openssl=${OPENSSL_DIR} \
    --with-openssl-rpath=auto \
    --enable-shared \
    --enable-loadable-sqlite-extensions \
    LDFLAGS="-Wl,-rpath=/usr/local/python3.11.9/lib -L${OPENSSL_DIR}/lib64" \
    CPPFLAGS="-I${OPENSSL_DIR}/include"

# 检查配置结果
echo ""
echo "=== 检查 OpenSSL 配置 ==="
if grep -q "checking for openssl/ssl.h in ${OPENSSL_DIR}... yes" config.log && \
   grep -q "checking whether compiling and linking against OpenSSL works... yes" config.log; then
    echo "✓ OpenSSL 配置成功"
else
    echo "✗ OpenSSL 配置失败,请检查 config.log"
    grep -A 5 "checking for openssl" config.log | tail -20
    exit 1
fi

echo ""
echo "开始编译(这可能需要几分钟)..."
sudo -E make -j$(nproc)

echo ""
echo "检查 _ssl 模块是否生成..."
SSL_MODULE=$(find . -name "_ssl*.so" | head -1)
if [ -n "$SSL_MODULE" ]; then
    echo "✓ 找到 SSL 模块: $SSL_MODULE"
else
    echo "✗ 未找到 SSL 模块"
    exit 1
fi

echo ""
echo "安装 Python..."
sudo make install

echo ""
echo "配置系统库和环境..."
echo "/usr/local/python3.11.9/lib" | sudo tee /etc/ld.so.conf.d/python3.11.conf
sudo ldconfig

echo 'export PATH=/usr/local/python3.11.9/bin:$PATH' | sudo tee /etc/profile.d/python3.11.sh
source /etc/profile.d/python3.11.sh

echo ""
echo "=== 验证安装 ==="
echo "Python 版本:"
/usr/local/python3.11.9/bin/python3.11 --version

echo ""
echo "OpenSSL 版本:"
/usr/local/python3.11.9/bin/python3.11 -c "import ssl; print(ssl.OPENSSL_VERSION)"

echo ""
echo "测试 pip:"
/usr/local/python3.11.9/bin/pip3.11 --version

echo ""
echo "=== 安装完成 ==="

五、关键参数详解(非常重要)

1️⃣ --with-openssl

bash 复制代码
--with-openssl=/usr/local/openssl-3.0.13

👉 明确告诉 Python:用哪个 OpenSSL 编译


2️⃣ --with-openssl-rpath=auto

bash 复制代码
--with-openssl-rpath=auto

👉 避免运行时找不到 libssl.so

👉 比手动改 LD_LIBRARY_PATH 更稳定


3️⃣ --enable-shared

bash 复制代码
--enable-shared

👉 生成 libpython3.11.so

👉 对 embedding、某些 C 扩展很有用


六、如何确认 SSL 模块真的生效?

✅ 1. 查看 _ssl 模块

bash 复制代码
find /usr/local/python3.11.9 -name "_ssl*.so"

有输出即成功。


✅ 2. Python 内部验证

bash 复制代码
python3.11 -c "import ssl; print(ssl.OPENSSL_VERSION)"

示例输出:

text 复制代码
OpenSSL 3.0.13 30 Jan 2024

✅ 3. pip 验证

bash 复制代码
pip3.11 install requests

无 HTTPS 报错即可 🎉


七、常见错误排查

❌ configure 阶段找不到 OpenSSL

text 复制代码
checking for openssl/ssl.h... no

解决:

  • 确认 OpenSSL 是 源码安装
  • 确认 ${OPENSSL_DIR}/include/openssl/ssl.h 存在

❌ 运行时报 libssl 找不到

text 复制代码
error while loading shared libraries: libssl.so.3

解决:

bash 复制代码
ldd $(which python3.11)
ldconfig

或检查 --with-openssl-rpath


八、总结

✅ 本文通过 显式指定 OpenSSL 3.0.13

✅ 从编译阶段解决 Python 缺失 SSL 模块的问题

✅ 适用于:

  • pip 无法使用
  • requests / urllib3 报 SSL 错
  • Python 3.11 源码安装环境

一句话总结:

pip 没 SSL,不是 pip 的问题,是 Python 编译时 OpenSSL 没配好。


相关推荐
吃茄子的猫3 小时前
quecpython中&的具体含义和使用场景
开发语言·python
じ☆冷颜〃3 小时前
黎曼几何驱动的算法与系统设计:理论、实践与跨领域应用
笔记·python·深度学习·网络协议·算法·机器学习
数据大魔方4 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
APIshop4 小时前
Python 爬虫获取 item_get_web —— 淘宝商品 SKU、详情图、券后价全流程解析
前端·爬虫·python
风送雨4 小时前
FastMCP 2.0 服务端开发教学文档(下)
服务器·前端·网络·人工智能·python·ai
效率客栈老秦4 小时前
Python Trae提示词开发实战(8):数据采集与清洗一体化方案让效率提升10倍
人工智能·python·ai·提示词·trae
哈里谢顿4 小时前
一条 Python 语句在 C 扩展里到底怎么跑
python
znhy_234 小时前
day46打卡
python
Edward.W5 小时前
Python uv:新一代Python包管理工具,彻底改变开发体验
开发语言·python·uv
小熊officer5 小时前
Python字符串
开发语言·数据库·python