前言

本文描述手动编译 python3.10 缺少 openssl 模块问题解决方案和几个小时解决这个问题的全过程。虽然我编译的是 python3.10,但是对于 python3.6、python3.8 应该同样适用(打脸了,python3.8 查看这篇文章)。

解决方案

我的服务器环境是 centos7,如果是其他环境,某些命令可能用不了,自行百度一下。下面进入正题:

安装 openssl-1.1.1

  1. wget https://www.openssl.org/source/openssl-1.1.1n.tar.gz --no-check-certificate 下载openssl1.1.1
  2. tar -zxf openssl-1.1.1n.tar.gz 解压
  3. cd openssl-1.1.1n
  4. ./Configure --prefix=/usr/local/openssl 设置安装目录 可以自定义 但是要记住,后面会用到
  5. make -j && make install 编译并安装

重新编译 python3.10

  1. 切换到 python3.10 解压包目录
  2. 已经编译过的可以先 make clean 清理一下
  3. ./configure --prefix=/usr/local/python3 --with-openssl=/usr/local/openssl –with-openssl-rpath=auto 标粗的这个一定别漏了
  4. make -j && make install
  5. 到这就安装好了,如果只是解决问题可以不往下看了。

详细过程

  1. pip3 search anyHub 看一下有没有这个库
    报错 Caused by SSLError(“Can’t connect to HTTPS URL because the SSL module is not available.”)

  2. -_-||, 之前编译vim8 需要python3,装了几个版本的python3 ,但是ssl这个报错都存在,看来得先把这个解决,不然不能保证python3是完整可用的。

  3. 看网上说是openssl版本对不上,yum update -y openssl openssl-devel 升级一下openssl

  4. 现在就要重新编译 python3.10 了,因为我之前试过3.8、3.6 都会报错,所以干脆就搞最新的。

  5. 编译要带编译选项,我就想看下之前编译时传了哪些参数,避免影响其他功能了,那怎么查看已经编译好的python 用了什么编译选项呢?

  6. 这里有几种方法:

    1. python3 -m sysconfig | less 这展示了 python 所有环境变量,太多了,我要的是显示我手动传递的编译参数,换下一个。

    2. import sysconfig
      print(sysconfig.get_config_vars()) 麻蛋 也是显示所有的

    3. import sysconfig
      print(sysconfig.get_config_vars(“CONFIG_ARGS”)) 终于对了,我这里就传了一个编译参数
      在这里插入图片描述

  7. 还有个准备工作,我应该加什么编译参数? 因为我印象中我之前编译的时候,加过各种各样带有 openssl 的编译选项,但是都没啥用。例如:–with-openssl=/usr/local/openssl/lib

  8. 那怎么查看 python 支持的编译选项?
    ./configure --help
    在这里插入图片描述

  9. 但是我并不知道这个参数是传 openssl 的什么目录,网上查了一通,有人说什么都不跟,那就试一下先,结果报错如下:
    ./configure --prefix=/usr/local/python3 –with-openssl在这里插入图片描述

  10. 搜一下报错代码,发现 with-openssl 必须赋值
    在这里插入图片描述

  11. 通过后续使用 ssldirs 的代码可以看出这里传递的目录名应该包含以下文件:

    1. xxx/include/openssl/ssl.h  头文件 xxx 为 --with-openssl=xxx 中的路径信息
    2. xxx/lib/libssl.so 和 xxx/lib/libcrypto.so 动态库文件
      在这里插入图片描述
  12. 大致了解了传递的 path 需要具备什么样的子目录,那么就先到官网下一个最新版的 openssl-3.0.0

    1. wget https://www.openssl.org/source/openssl-3.0.2.tar.gz --no-check-certificate

    2. ./Configure 报错
      在这里插入图片描述

    3. 百度解决该报错,需要安装 perl-CPAN

      yum install -y perl-CPAN
      perl -MCPAN -e shell
      cpan[1]> install IPC/Cmd.pm		
      
  13. ./Configure --prefix=/usr/local/openssl 再次配置

  14. make && make install

  15. 查看安装好的文件目录发现 /usr/local/openssl 下面没有 lib 目录,只有 lib64,但是我们上面提到,该路径下必须有 xxx/lib/libssl.so ,那么我们手动 copy 出来一个:
    cp -rf /usr/local/openssl/lib64 /usr/local/openssl/lib

  16. 重新编译 pyton3.10

    1. ./configure --prefix=/usr/local/python3 --with-openssl=/usr/local/openssl
    2. make -j  编译,但是报错了
    

    在这里插入图片描述

  17. 根据报错信息分析下:(当时要是多往错误信息上面看几行就好了)

    1. 当前不能构建ssl module 那么就是3.0版本不行哦 (看完后续大家可以试试就用3.0,毕竟3.0官网说的支持到26年,1.1.1支持到23年11月份)
    2. 需要 1.1.1 或者更新 ,yum 看一下我们之前的openssl版本,果然只有1.0.2, 那么下一个 1.1.1 的来试试吧。
      在这里插入图片描述
  18. 和前面安装 openssl-3.0 步骤一样,只是链接改成 https://www.openssl.org/source/openssl-1.1.1n.tar.gz ,编译好了 openssl 1.1.1 ,再来编译python,又报错说找不到libssl.so.1.1:

  19. 这次报错信息就很明确了,找不到对应的库 libssl.so.1.1。我严重怀疑之前 3.0 这里也是报的这个错误信息,大家可以自己试试。

  20. 但是我这路径下是有该文件的:
    在这里插入图片描述

  21. 这时候再把 python 支持的关于 openssl 的编译选项翻出来看,发现漏了个关键信息
    在这里插入图片描述
    rpath默认为 no,如果不手动设置为 auto, --with-openssl 选项设置了也没用,设置了再来试试。

  22. ./configure --prefix=/usr/local/python3 --with-openssl=/usr/local/openssl –with-openssl-rpath=auto
    这里插一句 可以用 make -j 加快编译,不要 make && make install, 因为这种不阻断流程的错误信息,你就看不到了,我最开始就是 -_-||

  23. 编译成功,至少这次没有刚才的关于 openssl 的错误信息了,现在 make Install 安装
    在这里插入图片描述

  24. 使用新的pip3 再来搜索下 anyHub ,又有报错,不过已经不是 openssl 引发的了:
    在这里插入图片描述

  25. 百度了下发现是要安装 pip_search 包,pip3 install pip_search 安装下包

  26. pip_search anyHub 报错:找不到命令
    在这里插入图片描述

  27. 因为没有把 /usr/local/python3/bin 加到path里面,所以只能显示调用安装位置的 pip_search 程序,到这里为止,带openssl 模块的 python3.10 可以确认是安装好了
    在这里插入图片描述

结语

耐心看手册,细心看日志,可以少走一些弯路。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐