python3.6.15的编译安装
侧边栏壁纸
博主昵称
yuc

  • 累计撰写 291 篇文章
  • 累计收到 0 条评论

python3.6.15的编译安装

yuc
yuc
2024-09-27 / 最后修改: 2024-10-21 06:12 / 0 评论 / 9 阅读 / 正在检测是否收录...
背景

现存一些古老的站点使用了旧的 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 相关的参数的

所以接下来大量检索了上网的办法,大概如下:

  1. 编译之前指定参数
export LDFLAGS="-L/data/software/openssl1.0.2/lib"
export CPPFLAGS="-I/data/software/openssl1.0.2/include"
  1. 修改 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
  1. 再次编译安装。这次编译都通不过了,提示找不到 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。猜测有两个方案:

  1. 可以尝试在编译python的时候使用 libffi8
  2. 把源机器的 libffi.so.6 发送到目的机器的动态库目录

急着使用,所以先尝试了方法2,目前基本上代码执行都没问题,后续测试方法1

0

评论

博主关闭了当前页面的评论