解决自编译 Python 报错 No module named ‘_ssl’
本文最后更新于 238 天前,其中的信息可能已经有所发展或是发生改变。
内容目录

我在我的 nas 上安装了自编译的 python 3.8-3.12 版本,但是使用的时候报错:

No module named '_ssl'

这是我的编译参数:

./configure --enable-loadable-sqlite-extensions --prefix=$TARGET_DIR --with-openssl=/usr/include/openssl

问题是是出在 --with-openssl=/usr/include/openssl 上,--with-openssl 参数实际上是为了使用自编译的 openssl 的,假如编译 openssl 的时候使用了 --prefix 参数:

./config --prefix=/usr/local/openssl

那么编译 python 时就需要用 --with-openssl 参数把这个 --prefix 的路径设置上去:

./configure --enable-loadable-sqlite-extensions --prefix=$TARGET_DIR --with-openssl=/usr/local/openssl

而实际上可以直接使用系统自带的 openssl,此时使用的参数是 --with-openssl-rpath=auto 而非 --with-openssl

./configure --enable-loadable-sqlite-extensions --prefix=$TARGET_DIR --with-openssl-rpath=auto

最后分享以下我使用 python 编译脚本,需要自行下载 python 源码包,并解压到脚本同一目录,目录结构:

madray@nas:/mnt/core/home/work/python$ ll
总计 32K
drwxr-xr-x  7 madray madray 4.0K  3月27日 21:44 ./
drwxr-xr-x 11 madray madray 4.0K  3月26日 04:50 ../
-rwxr-xr-x  1 madray madray 1.7K  3月27日 21:44 install.sh*
drwxr-xr-x 17 madray madray 4.0K  3月27日 21:46 Python-3.10.13/
drwxr-xr-x 17 madray madray 4.0K  3月27日 21:45 Python-3.11.7/
drwxr-xr-x 18 madray madray 4.0K  3月27日 21:47 Python-3.12.1/
drwxr-xr-x 17 madray madray 4.0K  3月27日 21:48 Python-3.8.18/
drwxr-xr-x 17 madray madray 4.0K  3月27日 21:50 Python-3.9.18/

install.sh:

#!/bin/bash

set -e

PYTHON_ROOT=/mnt/core/lib/python
THREAD=28

# 检查是否存在 --python 参数
UPDATE_PYTHON=false
for arg in "$@"; do
    if [ "$arg" == "-f" ]; then
        UPDATE_PYTHON=true
        break
    fi
done

sudo apt update
sudo apt install libsqlite3-dev openssl libssl-dev -y

# 获取当前目录
WORKDIR=$(pwd)

# 遍历目录下所有符合条件的文件夹,并收集版本信息
declare -A latest_versions
for dir in $WORKDIR/Python-3.*.*; do
    if [[ -d "$dir" ]]; then
        VERSION=$(basename $dir | cut -d '-' -f 2)
        MAJOR_MINOR=$(echo $VERSION | cut -d '.' -f 1,2)

        # 更新最新版本信息
        if [ -z "${latest_versions[$MAJOR_MINOR]}" ] || [ "${latest_versions[$MAJOR_MINOR]}" < "$VERSION" ]; then
            latest_versions[$MAJOR_MINOR]=$VERSION
        fi
    fi
done

# 安装或更新Python版本
for MAJOR_MINOR in "${!latest_versions[@]}"; do
    VERSION=${latest_versions[$MAJOR_MINOR]}
    TARGET_DIR="$PYTHON_ROOT/$VERSION"
    LINK="$PYTHON_ROOT/$MAJOR_MINOR"

    # 检查是否需要更新或安装
    if [ -d "$TARGET_DIR" ] && ! $UPDATE_PYTHON; then
        echo "目录 $TARGET_DIR 已存在。跳过..."
        continue
    fi

    # 删除旧版本和软连接
    if [ -d "$TARGET_DIR" ]; then
        echo "正在删除旧版本: $TARGET_DIR"
        sudo rm -rf "$TARGET_DIR"
        sudo rm -f "$LINK"
    fi

    # 安装新版本
    echo "正在安装Python版本: $VERSION"
    cd "$WORKDIR/Python-$VERSION"
    make clean
    ./configure --enable-loadable-sqlite-extensions --prefix=$TARGET_DIR --with-openssl-rpath=auto
    make -j$THREAD && make install
    sudo ln -s $VERSION $LINK
    cd $WORKDIR
done
上一篇
下一篇