文章目录

  • 前情提要
  • 安装 openssl-1.1.1
  • 重新编译安装 python3.8
  • -rpath 编译选项介绍
  • python3.8 跟 python3.10 的区别

前情提要

我在之前给 python3.10 安装 ssl 模块后以为该步骤 “对于 python3.6、python3.8 应该同样适用。” 。今天晚上我尝试给服务器安装一个带 ssl 模块的 python3.8 的时候,照着之前安装 3.10 的方案来,然后失败了-_-||。又折腾了一下,发现 3.8 和 3.10 的配置脚本是有区别的,不能一概而论,本文总结了一下 3.8 如何正确的编译安装 python 的 openssl 模块及其原理,以及 3.8 和 3.10 配置脚本的区别。

安装 openssl-1.1.1

  • wget https://www.openssl.org/source/openssl-1.1.1n.tar.gz --no-check-certificate 下载openssl1.1.1
  • tar zxf openssl-1.1.1n.tar.gz 解压
  • cd openssl-1.1.1n
  • ./Configure --prefix=/usr/local/openssl 设置安装目录 可以自定义 但是要记住,后面会用到
  • make -j && make install 编译并安装
  • 将 /usr/local/openssl/lib 路径添加到系统动态库查找路径中,在 home 目录下的 .bashrc 文件最后面添加下面这一行
    export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH
    
  • souce .bashrc 立即生效

重新编译安装 python3.8

  • 切换到 python3.8 解压包目录
  • 已经编译过的可以先 make clean 清理一下
  • yum install libffi-devel -y 安装 libffi-devel ,这个是为了 _ctypes 模块
  • ./configure --prefix=/usr/local/python3 --with-openssl=/usr/local/openssl --with-ssl-default-suites=openssl --with-system-ffi
  • make -j && make install

到这应该安装成功了,如果还有问题的话留言讨论吧-_-||

-rpath 编译选项介绍

-rpath 是 gcc 的一个编译选项,用于指定程序运行时动态链接库的搜索路径。当程序运行时需要动态链接库时,系统会在指定的路径中搜索动态链接库。

例如,假设有一个程序 a.out,它需要动态链接库 libfoo.so,而 libfoo.so 位于 /usr/local/lib 目录下,那么可以使用以下命令编译程序:

gcc -o a.out a.c -L/usr/local/lib -lfoo -Wl,-rpath=/usr/local/lib

其中,-L 选项指定编译器在编译时搜索库文件的路径,-l 选项指定需要链接的库文件名。-Wl,-rpath=/usr/local/lib 选项指定程序运行时搜索动态链接库的路径。

这样,当程序 a.out 运行时,系统会在 /usr/local/lib 目录下搜索 libfoo.so 动态链接库。

python3.8 跟 python3.10 的区别

查看 python3.8 配置脚本关于 openssl 的帮助信息

查看 python3.10.3 配置脚本关于 openssl 的帮助信息

python3.10.3 中多出来的这个选项是说是否在 gcc 编译的时候传递 -rpath 选项给编译器,所以可以按我这篇文章中的做法处理。
python3.8 的配置脚本没有这个选项,但是他编译过程中又查找的是名为 libssl.so 的动态库。这时候我们不能传递 -rpath=/usr/local/openssl/lib, 只能采取其他办法,想来这也是 3.10 新增选项的原因。
那要怎么解决这个问题呢,我想到有四种解决方案:

  1. 方法一 属于奇技淫巧,将动态库文件名实际指向静态库文件,即 ln -s libxxx.a libxxx.so,这样即使没有 -rpath 选项,也没关系了,因为跟 python 编译链接的是静态库,而静态库的路径已经由 --with-openssl=/usr/local/openssl 选项指定了。(不推荐)

  2. 方法二 可以修改 python 的编译脚本,强行指定 -rpath,这种做法和官方 3.10 做的效果一样。(不推荐)

  3. 方法三 在系统的动态库默认搜索路径下创建一个指向 /usr/local/openssl/lib/ 下两个需要的动态库的软链接。(不推荐)
    Linux系统默认的C动态库搜索目录包括以下几个:

    /lib
    /usr/lib
    /usr/local/lib
    

    这些目录是在系统启动时就被设置好的,当程序需要链接动态库时,系统会自动在这些目录中搜索相应的库文件。

  4. 方法四 就是本文所采用的方案,将 /usr/local/openssl/lib 添加到 LD_LIBRARY_PATH 环境变量中了,优雅且简单。(推荐)

python3.8 安装 ssl 模块 和 _ctypes 模块相关推荐

  1. ModuleNotFoundError: No module named ‘pygame’——Python3.6安装pip并下载pygame模块

    问题: 今天学习python的时候,运行时报错:ModuleNotFoundError: No module named 'pygame'.意思就是没有 pygame 这个模块 解决办法: 下载一下这 ...

  2. python3.8安装xlwings出错_Python xlwings模块简单使用

    Python xlwings模块简单使用xlwings 安装 xlwings excel-book-打开-新建 xlwings sheet-api xlwings 操作数据 xlwings 读取数据 ...

  3. kali python3安装scapy库_Kali-Python scapy模块-扫描

    Kali Python3环境安装scapy模块pip3 install scapy 本地网卡网段arp_scan脚本import logging import subprocess logging.g ...

  4. linux环境下安装python3以及安装cx_Oracle模块需要注意的事项

    linux环境下安装python3以及安装cx_Oracle模块需要注意的事项 python3的安装 1. 首先安装python3之前首先要安装python所依赖的环境 yum install gcc ...

  5. 【Python3爬虫(三)】【urlib.request模块】【cookie+Request】

    上一篇:[Python3爬虫(二)][urlib.request模块][付费代理+auth认证] ++++++++++开始线++++++++++++++++++ 文章目录 一. cookie 1.1 ...

  6. python3导入模块原理_Python模块导入机制与规范

    前言 在我们平常工程里使用Python的过程中,经常需要解决各个模块的导入问题,而且也常常遇到引用路径查找不到.交叉导入模块等等问题,故写这篇文章,旨在讲述Python的模块导入机制和我们平时大型项 ...

  7. 树莓派Raspberry Pi上安装和使用RPi.GPIO模块以及引脚对照表

    记录自己学习树莓派的过程. 如果要使用Python来使用GPIO信号,需要使用RPi.GPIO模块. 如果你使用的是Python2版本,树莓派默认安装了RPi.GPIO模块(python-rpi.gp ...

  8. python3导入ping模块_Python ping 模块

    print socket.gethostbyname('www.baidu.com') fping功能 https://www.cnblogs.com/zhoujie/p/python17.html ...

  9. Python3 超好用的音频播放模块 playsound

    Python3 超好用的音频播放模块 playsound 前言 playsound模块介绍 一.模块安装 二.使用 三.使用中遇到大坑:文件无法解除占用! 前言 python2有个很好用的音频播放模块 ...

最新文章

  1. 饥荒计算机丢失xinput1 3.dll,《德军总部:旧血脉》Win8运行提示丢失XINPUT1_3.dll解决方法...
  2. 与splash详解相关的
  3. Android 蓝牙开发实例--蓝牙聊天程序的设计和实现
  4. queueing 优化_网站加载性能
  5. PostgreSQL与MySQL比较
  6. 数据中心自动化及其优势
  7. XeLaTeX插入GB/T 7714-2005规范的参考文献方法
  8. linux几种快速清空文件内容的方法
  9. 数组的合并和升序排列_JavaScript - 数组排序 6 种常见算法是什么?
  10. 【2021云边协同大会】阿里云周哲畅聊边缘云基础设施创新发展及场景化实践
  11. 股市最典型的穷人思维是什么?
  12. web 开发 —— html 与 css(div)
  13. 【动态规划】leetcode 53:最大子数组和
  14. matlab如何生存对称矩阵,如何使用Matlab产生对称矩阵
  15. 手把手教你十分钟搞定影视类的微信公众号图文排版!
  16. C#(OpenGL MathNet)处理Gauss光斑图像
  17. Linux下更新Chrome和vscode
  18. 高新技术企业避坑解读之“盲目跟风”
  19. 105 THREE.JS 手动实现相机沿焦点旋转
  20. 2.5 linux存储的基本管理

热门文章

  1. D3D HOOK实现透视讲解
  2. ise 时钟约束_xilinx时序约束
  3. python多种计算阶乘和斐波那契数列的六脉神剑
  4. chatGPT爆火,什么时候中国能有自己的“ChatGPT“
  5. JavaScript高级【闭包】
  6. 浮点数和无符号整型互转
  7. fatfs移植和使用(在W25Q16上建立文件系统)
  8. 网站SEO优化 教育行业的SEO优化怎么做?
  9. 和学艺术朋友聊完后,发现学计算太幸运了
  10. SAP MTS案例教程目录2022