本文最后更新于 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