CentOS安装Python 3.10跳坑记

笔者在一台 CentOS 7.9 服务器上升级 Python 3.10 后,运行 pip3.10 安装依赖库总是报错:

There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.

这个错误表明在编译Python 3.10时,SSL模块并未正确构建,或者可能是 openSSL 版本太低导致。尝试运行 openssl version ,服务器返回 openSSL 的版本号:

OpenSSL 1.0.2k-fips  26 Jan 2017

都2024年了,该服务器还用着老旧的 openSSL, 难怪新版本的软件不兼容。为了使SSL模块能正确构建,并且Python编译配置能找到这些库,需要手动更新OpenSSL。

1、下载并编译 OpenSSL:

首先,尝试把 openSSL 从1.0.2k 升级到 1.1.1l,下载并解压 OpenSSL 的源代码,然后编译并安装它。

sudo yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
cd /usr/src
wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz
tar xzf openssl-1.1.1l.tar.gz
cd openssl-1.1.1l
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
make
sudo make install

2、配置环境变量:

上面的命令如果顺利完成安装 OpenSSL ,第二步需要更新系统的环境变量,以便系统能够找到新的 OpenSSL 库和可执行文件。

export LD_LIBRARY_PATH=/usr/local/openssl/lib
export PATH=/usr/local/openssl/bin:$PATH

这样做会将 /usr/local/openssl/bin 添加到 PATH 环境变量,/usr/local/openssl/lib 添加到 LD_LIBRARY_PATH 环境变量中,以确保系统能够找到新的 OpenSSL 可执行文件。

3、验证新版本的 OpenSSL:

运行 openssl version 命令来验证系统是否正在使用新版本的 OpenSSL。
如果一切顺利,这应该显示新安装的 OpenSSL 的版本信息,例如:

OpenSSL 1.1.1l  24 Aug 2021

4、下载 Python 源代码进行编译

cd /usr/src
wget https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tgz
tar xzf Python-3.10.0.tgz
cd Python-3.10.0export LDFLAGS="-L/usr/lib64"
export CPPFLAGS="-I/usr/include/openssl"./configure --enable-optimizations --with-openssl=/usr/include/openssl --with-openssl-rpath=/usr/lib64
make altinstall
注:最后一条命令是 make altinstall,而不是 make install,目的是为了保留服务器原来的 Python 版本不被覆盖。

5、验证

无论使用哪种方法,都应在编译并安装 Python 3.10 后,验证 SSL 模块是否正确构建:

/usr/local/bin/python3.10 -c "import ssl; print(ssl.OPENSSL_VERSION)"

如果输出了 OpenSSL 版本信息,例如:

OpenSSL 1.1.1l  24 Aug 2021

则说明 SSL 模块已经正确安装。
这样就能愉快地继续使用 pip3.10 install 安装依赖库了。

6、One more thing:下次进入服务器的shell,为什么查看 OpenSSL 的版本号仍然是旧版?上次升级的 OpenSSL 怎么了?

这是因为 Python 和系统使用的 OpenSSL 版本是独立的。你编译安装的 Python 3.10 使用了你手动安装的OpenSSL 1.1.1l,而系统默认的 OpenSSL 版本仍然是1.0.2k。这种情况很常见,尤其是在你手动编译和安装软件时。

以下是导致这种现象的几个原因以及相关解释:

系统OpenSSL vs 自定义OpenSSL

  1. 系统OpenSSL:系统默认的OpenSSL版本由系统包管理器(如yum)管理,通常不会被你手动编译的OpenSSL覆盖。这确保了系统的稳定性,因为很多系统级别的工具和服务依赖于默认的OpenSSL版本。

  2. 自定义OpenSSL:当你手动编译并安装一个新版本的OpenSSL(如1.1.1l),你可以指定安装目录(例如/usr/local/openssl),并且这个版本的OpenSSL可以被特定的软件(如你编译的Python 3.10)使用。

如何让系统使用新的OpenSSL版本

如果你确实需要让系统使用新的OpenSSL版本,这通常不推荐,因为可能会破坏系统依赖项,以下是可能的步骤:

  1. 备份现有的OpenSSL

    在做任何系统级别的更改前,备份现有的OpenSSL库文件:

    sudo cp /usr/bin/openssl /usr/bin/openssl.bak
    sudo cp -r /usr/lib64/openssl /usr/lib64/openssl.bak
    
  2. 替换系统的OpenSSL

    用新的OpenSSL替换系统的OpenSSL。这一步要非常小心,因为可能会导致系统不稳定或不可用。

    sudo mv /usr/bin/openssl /usr/bin/openssl.old
    sudo cp /usr/local/openssl/bin/openssl /usr/bin/
    sudo cp -r /usr/local/openssl/lib/* /usr/lib64/
    sudo ldconfig
    

推荐方法:使用环境变量

为了避免破坏系统,建议在需要的地方使用环境变量指定OpenSSL版本。

  1. 设置环境变量

    在需要的地方设置环境变量:

    export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH
    export PATH=/usr/local/openssl/bin:$PATH
    
  2. 验证

    重新打开一个终端或shell,确保环境变量生效,然后运行:

    openssl version
    

这种方法不会影响系统默认的OpenSSL版本,但会确保在你指定的环境中使用新的OpenSSL版本。

总结

系统默认的OpenSSL版本和你手动编译安装的OpenSSL版本是独立的。你已经成功让Python 3.10使用新的OpenSSL版本,而系统的OpenSSL版本保持不变。建议在需要的环境中使用环境变量指定新的OpenSSL版本,而不是全局替换系统的OpenSSL版本,以保持系统的稳定性和兼容性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/25341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入了解FAT文件系统

FAT(File Allocation Table,文件分配表)文件系统是由微软开发的一种简单高效的文件系统格式。它广泛应用于各种存储设备,如U盘、SD卡等。本文将详细介绍FAT文件系统的关键术语、结构和功能实现,帮助读者全面了解这一经…

DP:回文串模型

一、回文子串 . - 力扣(LeetCode) 该题有3种解法 (1)中心扩展算法(在字符串章节有介绍)时间复杂度O(N^2),空间复杂度O(1) (2)马丁车…

Spring AI 第二讲 之 Chat Model API 第六节Google VertexAI API

VertexAI API 可提供高质量的定制机器学习模型,只需花费最少的机器学习专业知识和精力。 Spring AI 通过以下客户端提供与 VertexAI API 的集成: VertexAI Gemini Chat Vertex AI Gemini API 允许开发人员使用 Gemini 模型构建生成式人工智能应用程序。…

Apollo9.0 PNC源码学习之Control模块(一)

0 前言 从planning的角度看control,首先需要了解的就是相关的数据接口,规划出的轨迹(路径速度)发给Control模块去执行 modules/planning/planning_component/planning_component.cc planning模块发布轨迹信息 planning_writer_ …

利用CSS隐藏HTML元素并插入替代内容

在创建一个支持切换阅读模式和答题模式的Anki问答题模板中,我创建了一个支持切换阅读模式和答题模式的问答题模板,该文最终利用JavaScript将Anki输出的向下箭头删除,并插入自定义的提示语。经过进一步测试,发现实现上述功能完全不…

Unity 从0开始编写一个技能编辑器_02_Buff系统的生命周期

工作也有一年了,对技能编辑器也有了一些自己的看法,从刚接触时的惊讶,到大量工作时觉得有一些设计的冗余,在到特殊需求的修改,运行效率低时的优化,技能编辑器在我眼中已经不再是神圣不可攀的存在的&#xf…

【微信小程序】开发环境配置

目录 小程序的标准开发模式: 注册小程序的开发账号 安装开发者工具 下载 设置外观和代理 第一个小程序 -- 创建小程序项目 查看项目效果 第一种:在模拟器上查看项目效果 项目的基本组成结构 小程序代码的构成 app.json文件 project.config…

燃料电池汽车践行者

前言 见《氢燃料电池技术综述》 见《燃料电池工作原理详解》 见《燃料电池发电系统详解》 见《燃料电池电动汽车详解》 见《氢燃料电池汽车行业发展》 现代汽车(中国) 现代汽车集团,自1998年成立氢燃料电池研发小组以来深耕氢燃料电池技术&am…

html+CSS+js部分基础运用19

1. 应用动态props传递数据,输出影片的图片、名称和描述等信息【要求使用props】,效果图如下: 2.在页面中定义一个按钮和一行文本,通过单击按钮实现放大文本的功能。【要求使用$emit()】 代码可以截图或者复制黏贴放置在“实验…

spring-data-mongodb版本兼容问题

spring-data-mongodb与mongodb驱动有兼容性问题,不匹配会报NoSuchMethod异常,mongodb的java驱动包在4.0之后由mongodb-java-driver更名为mongodb-driver-sync。 spring-data-mongodb包依赖中有mongodb-driver-core,但缺诸如MongoCollection等…

【C语言】文件操作(终卷)

前言 我们在上一卷中了解了顺序读写的函数,现在就让我们从随机读写的函数开始吧。 什么是随机读写? 就是想在哪个位置读或写都行,比较自由。文件打开时光标默认在起始位置。想从后面的某个部分读或写,就得让文件指针来到那个位…

VMware Fusion 如何增加linux硬盘空间并成功挂载

文章目录 0. 前言1. 增加硬盘空间2. 硬盘分区2.1 查看硬盘2.2 分区2.3 格式化2.4 挂载 3. 参考 0. 前言 如果发现虚拟机分配的硬盘不足,需要增加硬盘空间。本文教给大家如何增加硬盘空间并成功挂载。 查看当前硬盘使用情况: df -h可以看到&#xff0c…

什么是档案数字化管理

档案数字化管理指的是将传统的纸质档案转换为数字形式,并通过电子设备、软件和网络技术进行管理和存储的过程。 档案数字化管理包括以下几个步骤: 1. 扫描和数字化:将纸质档案通过扫描仪转换为数字图像或文档。可以使用OCR(光学字…

SD 使用教程

SD 换脸步骤 使用Stable Diffusion (SD) 进行换脸的基本步骤可以从以下几个方面概述,这里以一种常见的方式为例,结合了插件的使用来简化流程: 准备工作 安装必要的软件和插件:首先,确保你已经安装了Stable Diffusion…

QT 信号和槽 解除关联示例 disconnect

对于源端的信号和接收端的槽函数,不仅可以进行关联,在关联之后,如果不需要用到它们的关联关系了,可以使用 disconnect 函数解除之前的关联关系。disconnect 函数就是 connect 函数的逆向过程,它们二者的参数是差不多的…

ubuntu24安装python2

下载python2 wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz 解压python2 sudo tar xzf Python-2.7.9.tgz 安装python2 sudo ./configure --enable-optimizations sudo make altinstall 创建快捷方式(随便选择一种) sudo ln -sfn…

Qt QStackedWidget类详细分析

一.定义 QStackedWidget类是一个容器控件,它提供了一个堆叠的页面布局方式,每个页面可以包含一个子部件。在QStackedWidget中,只有当前活动的页面是可见的,其他页面会被隐藏起来。 QStackedWidget类的常用方法包括: a…

[数据集][图像分类]人种黄种人白人黑人分类数据集970张4类别

数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):970 分类类别数:4 类别名称:[“Asian”,“Caucasian”,“Indian…

什么是 AOF 重写?AOF 重写机制的流程是什么?

引言:在Redis中,持久化是确保数据持久性和可恢复性的重要机制之一。除了常见的RDB(Redis Database)持久化方式外,AOF(Append Only File)也是一种常用的持久化方式。AOF持久化通过记录Redis服务器…

01 基础知识

1、Git 的使用 Git 在工作中常用,是必学的东西。请参考下面 pdf 教程搭建环境,并尝试维护一个自己的 github: 下面 git 常用命令,应对 90% 以上工作需求: git clone //从服务器拉取代码 git config //配置开发者用户名和邮箱 git branch //创建、…