【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 没配好。


相关推荐
玄同7654 分钟前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
小瑞瑞acd20 分钟前
【小瑞瑞精讲】卷积神经网络(CNN):从入门到精通,计算机如何“看”懂世界?
人工智能·python·深度学习·神经网络·机器学习
火车叼位39 分钟前
也许你不需要创建.venv, 此规范使python脚本自备依赖
python
火车叼位1 小时前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
孤狼warrior1 小时前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
Katecat996631 小时前
YOLO11分割算法实现甲状腺超声病灶自动检测与定位_DWR方法应用
python
玩大数据的龙威2 小时前
农经权二轮延包—各种地块示意图
python·arcgis
ZH15455891312 小时前
Flutter for OpenHarmony Python学习助手实战:数据库操作与管理的实现
python·学习·flutter
belldeep2 小时前
python:用 Flask 3 , mistune 2 和 mermaid.min.js 10.9 来实现 Markdown 中 mermaid 图表的渲染
javascript·python·flask
喵手2 小时前
Python爬虫实战:电商价格监控系统 - 从定时任务到历史趋势分析的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·电商价格监控系统·从定时任务到历史趋势分析·采集结果sqlite存储