当前位置: 首页 > news >正文

【python】linux系统python报错“ssl module in Python is not available”

一、问题现象

1.1 执行pip命令报错

pip安装时遇到openssl问题,没办法安装第三方库

“WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. ”

1.2 导入import  ssl 报错

直接执行python,进入python, 输入import  ssl ,也会报相似的错误。 

正常情况下,是这样的,导入成功无报错

1.3 执行python脚本报错

二、问题原因

根据出错信息提示分析:ssl模块不可用。

pip默认的安装源https://pypi.org/simple/,采用的是 HTTPS协议,连接是需要SSL库加密和解密。出错信息显示,你的Python没有所需的ssl模块。官网下载的Python已经内建了ssl模块,应该不会出现这个问题。

2.1 openssl版本低

系统版本centos7.4,其中openssl的版本为OpenSSL 1.0.2k-fips,而python3.11需要的openssl的版本为1.1.x及以上,需要对openssl进行升级,并重新编译python3.11(yum 安装的openssl 版本都比较低)。现在有些高版本的linux,openssl已经是1.1.x版本以上,不会出现该opensll版本问题。

2.3 openssl配置问题

已经源码编译安装了高版本的openssl,由于没有配置软链接、和openssl库的位置,导致的问题。

三、解决方案 

3.1 版本低-做OpenSSL升级

3.1.1 直接yum安装高版本的openssl 

yum install -y openssl openssl-libs  openssl-devel openssl-static 
#查看版本
openssl version

3.1.2 源码安装openssl升级(推荐)

wget  https://www.openssl.org/source/old/1.1.1/openssl-1.1.1q.tar.gz
tar -zxvf openssl-1.1.1q.tar.gz
cd openssl-1.1.1q
./config --prefix=/usr/local/openssl
make -j8
make install#设置软连接到新版本openssl
ln -sf /usr/local/bin/openssl /usr/bin/openssl
ln -sf /usr/local/include/openssl /usr/include/openssl
#openssl库位置配置
ln -sf /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -sf /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1echo "/usr/local/lib/" >> /etc/ld.so.conf
ldconfig -vopenssl version
openssl version -a

但是安装好之后,还可能出现以下问题

openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory ,这是由于openssl库的位置不正确造成的。

解决方法:以root用户下执行:

ln -s    /usr/local/lib64/libssl.so.1.1          /usr/lib64/libssl.so.1.1
ln -s    /usr/local/lib64/libcrypto.so.1.1    /usr/lib64/libcrypto.so.1.1

 我本机安装的情况:


3.2 配置问题-补充配置

#设置软连接到新版本openssl
ln -sf /usr/local/bin/openssl /usr/bin/openssl
ln -sf /usr/local/include/openssl /usr/include/openssl#openssl库位置配置
ln -sf /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -sf /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

看到有的网上说做环境变量配置,但是 感觉做软链接更清晰、简单点。就不谈环境变量配置了。

四、本人采取的方式(不推荐)

参考博主方法https://www.cnblogs.com/miyuanbiotech/p/12307875.html ,也能解决,

但是它是在编译时,可以直接将ssl模块编译进去。如果在安装其他版本的python到本机,不将openssl高版本编译进去,还是不能用。 所以推荐使用上面(三、解决方案)的方法解决该问题。

现在有些高版本的linux,openssl已经是1.1.x版本以上,不会出现该opensll版本问题。

4.1 包下载和安装路径配置

wget -c https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz
tar -xvf Python-3.8.1.tgz
cd Python-3.8.1
./configure --prefix=/my/path/python/
# 配置环境后先别急着编译

4.2 Modules/Setup文件修改

SSL=/my/path/openssl  #改为刚安装的ssl路径
_ssl _ssl.c \-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \-L$(SSL)/lib -lssl -lcrypto

4.3 编译安装

make && make install

此时如果直接make编译,仍会报如下类似错误:./python: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory generate-posix-vars failed make: *** [pybuilddir.txt] Error 1 缺少库文件,说明libssl.so.1.1这个库没有读取到。解决方法:有的是以root身份添加软链接。有的将openssl库加入环境变量。这个博主选择了后者。

#执行该命令 添加环境变量
export LD_LIBRARY_PATH=/my/path/openssl-1.1/lib:$LD_LIBRARY_PATH

(此处说一个比较坑的事)

环境变量配置,虽然运行python、和python脚本都没问题。但是做定时任务crontab 时,由于找不到openssl库,任务跑不起来。害自己排错好久,才找到这个原因。最后重新做了 openssl库文件的软连接。
ln -sf /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
n -sf /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

4.4 测试SSL模块

 该现象说明问题解决了。

五、知识拓展

centos7系统默认安装了python2.X,后续可能又安装了python3.X版本,所以在控制台输入命令进行查看当前机器上安装python情况。因为centos7部分模块依赖于2.X,所以为了不引起某些麻烦,选择不去卸载2.X,直接安装3.X。

# 查看2.x版本情况
python --version 
或
python -V# 查看3.x版本情况
python3 --version
python3 -V 和python

相关文章:

  • HCIA(11)OSPF 数据包构成(Hello、DBD、LSR、LSU、LSAck包)、状态机、工作流程(建立邻居关系、主从关系协商、LSDB同步)
  • 服务端实时推送技术之SSE(Server-Send Events)
  • 相机图像质量研究(39)常见问题总结:编解码对成像的影响--运动模糊
  • 【java中的方法如何定义与使用】
  • Spring Cloud Alibaba-04-Sentinel服务容错
  • element导航菜单el-menu添加搜索功能
  • PyTorch使用Tricks:学习率衰减 !!
  • Leetcode 209.长度最小的子数组
  • 第2讲-Memory
  • 一文带你解决如何设置Redis临时密码和永久密码
  • C++内联函数的使用
  • 面试前端性能优化八股文十问十答第三期
  • Python+Requests+Pytest+YAML+Allure实现接口自动化
  • SpringBoot项目嵌入RabbitMQ
  • VSCODE include错误 找不到 stdio.h
  • EOS是什么
  • FineReport中如何实现自动滚屏效果
  • Flannel解读
  • gcc介绍及安装
  • JAVA之继承和多态
  • JS 面试题总结
  • Just for fun——迅速写完快速排序
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • React系列之 Redux 架构模式
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue-cli3搭建项目
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 代理模式
  • 跨域
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 学习笔记:对象,原型和继承(1)
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ###C语言程序设计-----C语言学习(6)#
  • (20050108)又读《平凡的世界》
  • (9)STL算法之逆转旋转
  • (Ruby)Ubuntu12.04安装Rails环境
  • (ZT)出版业改革:该死的死,该生的生
  • (二)pulsar安装在独立的docker中,python测试
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (译) 函数式 JS #1:简介
  • (转)甲方乙方——赵民谈找工作
  • (转载)深入super,看Python如何解决钻石继承难题
  • .“空心村”成因分析及解决对策122344
  • .net 7 上传文件踩坑
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .net 按比例显示图片的缩略图
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET开发不可不知、不可不用的辅助类(一)
  • .net下简单快捷的数值高低位切换
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析