背景
现存一些古老的站点使用了旧的 ssl 版本,现在新版本的 python 无法使用,大概报错 unsupport protocol
,在测试了一番之后无论如何也解决不了,无法更换目的站点的 ssl 版本,那只能更换本地的 python 版本了
版本选择
这个站点在其他 python3.6 的机器上使用 requests 可以执行,所以计划本机再安装一个 python3.6.15
安装遇到的问题
安装完成后使用 pip3 总是 segmentation fault core dump
,解决办法参考文档:
https://stackoverflow.com/questions/74553858/how-to-fix-python-pip-segmentation-fault-core-dumped-response-from-virtualenv
补丁方案:
https://github.com/pyenv/pyenv-virtualenv/issues/410#issuecomment-1125942002
然后根据步骤编译安装
cd ~
mkdir py36
mkdir py36/tempfiles
cd py36/tempfiles
curl https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tar.xz --output Python-3.6.15.tar.xz
tar -xJvf Python-3.6.15.tar.xz
cd Python-3.6.15
vim alignment.patch # Use your preferred text editor
# Paste the contents of the patch, save and quit
patch -p0 < alignment.patch
cd ..
Python-3.6.15/configure --prefix=/home/<username>/py36 --enable-optimizations --with-lto
make
make install
cd ..
rm -rf tempfiles
新的问题
事情往往总是没有那么顺利
参照其他支持的机器先安装了低版本的 openssl1.0.2u
,然后 python3.6 使用参数 --with-openssl=/usr/local/openssl
来编译安装,但是结果查看 ssl 版本的时候仍然不对,查看命令
import ssl
print(ssl.OPENSSL_VERSION)
大概知道是参数没有成功,果然查看支持的参数 ./configure --help
是没有 ssl 相关的参数的
所以接下来大量检索了上网的办法,大概如下:
- 编译之前指定参数
export LDFLAGS="-L/data/software/openssl1.0.2/lib"
export CPPFLAGS="-I/data/software/openssl1.0.2/include"
- 修改 python 的源码文件 Modules/Setup,取消注释,并且修改为实际 openssl 路径
SSL=/data/software/openssl1.0.2
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
- 再次编译安装。这次编译都通不过了,提示找不到 libssl.so.0.0
接下来请教了 chatgpt,与网上的方案基本没有差别,所以仍然无效果
柳暗花明
最后突发奇想,咱们是 openssl 没法编译上,但我也不是必须要在这台机器上编译,于是我把其他编译好的机器发到这台上尝试运行,结果报错找不到 libssl.so.10
接着把安装的 openssl 库文件 libssl.so.0.0 连接到相关目录(通过 ldconfig -pv查看一般放在哪里),再次执行,成功运行
后续发现 pip3 是执行不了的,因为安装的目录不一致,python 安装目录下的所有脚本指定了 python 命令路径,
干脆在其他机器重新编译了安装路径保持一致
但 pip3 命令还是无法执行,缺少 libffi.so.6 库,于是尝试静态编译
./configure --prefix=/data/software/python3.6 --enable-shared --enable-static
结果无效果,反而 python 命令还要多增加一个动态库才能正常执行了, 在 python/lib 下链接到系统动态库目录后,仍然是 libffi 的错误,ubuntu 安装的是 libffi8,而源机器是6。猜测有两个方案:
- 可以尝试在编译python的时候使用 libffi8
- 把源机器的 libffi.so.6 发送到目的机器的动态库目录
急着使用,所以先尝试了方法2,目前基本上代码执行都没问题,后续测试方法1
评论