在Cent0S 7.5下将Python 2.7.5升级到Python 3.6.6后,发现ssl模块不可用,具体详细信息如下所示:

[root@db-server ~]# pip list

Package    Version

---------- -------

pip        19.2.3 

setuptools 39.0.1 

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

Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)) - skipping

 

[root@db-server ~]# python -V

Python 3.6.6

 

>>> import ssl

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "/usr/local/lib/python3.6/ssl.py", line 101, in <module>

    import _ssl             # if we can't import it, let the error propagate

ModuleNotFoundError: No module named '_ssl'

>>> 

>>> import socket

>>> hasattr(socket,"SSL")

False

>>>

检查发现openssl包已经安装了,然后按照网上的文章,修改Modules/Setup.dist中,找到SSL配置部分,如下截图所示

[root@db-server ~]# yum list installed |grep openssl

openssl.x86_64                        1:1.0.2k-19.el7                  @base    

openssl-libs.x86_64                   1:1.0.2k-19.el7                  @base 

# Socket module helper for SSL support; you must comment out the other

# socket line above, and possibly edit the SSL variable:

#SSL=/usr/local/ssl

#_ssl _ssl.c \

#       -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \

#       -L$(SSL)/lib -lssl -lcrypto

# The crypt module is now disabled by default because it breaks builds

# on many systems (where -lcrypt is needed), e.g. Linux (I believe).

#

# First, look at Setup.config; configure may have set this for you.

#_crypt _cryptmodule.c # -lcrypt        # crypt(3); needs -lcrypt on some systems

这里需要取消注释部分(上图红框附近部分的设置),设置SSL路径,但是这个SSL的安装路径在哪里呢? 我查找了一下,发现openssl的安装路径如下:

[root@db-server ~]# whereis openssl

openssl: /usr/bin/openssl /usr/lib64/openssl /usr/share/man/man1/openssl.1ssl.gz

[root@db-server ~]# rpm -ql openssl

/etc/pki/CA

/etc/pki/CA/certs

/etc/pki/CA/crl

/etc/pki/CA/newcerts

/etc/pki/CA/private

/etc/pki/tls/certs/Makefile

/etc/pki/tls/certs/make-dummy-cert

/etc/pki/tls/certs/renew-dummy-cert

/etc/pki/tls/misc/CA

/etc/pki/tls/misc/c_hash

/etc/pki/tls/misc/c_info

/etc/pki/tls/misc/c_issuer

/etc/pki/tls/misc/c_name

/usr/bin/openssl

/usr/share/doc/openssl-1.0.2k

/usr/share/doc/openssl-1.0.2k/FAQ

/usr/share/doc/openssl-1.0.2k/NEWS

/usr/share/doc/openssl-1.0.2k/README

/usr/share/doc/openssl-1.0.2k/README.FIPS

/usr/share/doc/openssl-1.0.2k/README.legacy-settings

/usr/share/licenses/openssl-1.0.2k

/usr/share/licenses/openssl-1.0.2k/LICENSE

/usr/share/man/man1/asn1parse.1ssl.gz

/usr/share/man/man1/ca.1ssl.gz

/usr/share/man/man1/ciphers.1ssl.gz

/usr/share/man/man1/cms.1ssl.gz

/usr/share/man/man1/crl.1ssl.gz

/usr/share/man/man1/crl2pkcs7.1ssl.gz

/usr/share/man/man1/dgst.1ssl.gz

/usr/share/man/man1/dhparam.1ssl.gz

/usr/share/man/man1/dsa.1ssl.gz

/usr/share/man/man1/dsaparam.1ssl.gz

/usr/share/man/man1/dss1.1ssl.gz

/usr/share/man/man1/ec.1ssl.gz

/usr/share/man/man1/ecparam.1ssl.gz

/usr/share/man/man1/enc.1ssl.gz

/usr/share/man/man1/errstr.1ssl.gz

/usr/share/man/man1/gendsa.1ssl.gz

/usr/share/man/man1/genpkey.1ssl.gz

/usr/share/man/man1/genrsa.1ssl.gz

/usr/share/man/man1/md2.1ssl.gz

/usr/share/man/man1/md4.1ssl.gz

/usr/share/man/man1/md5.1ssl.gz

/usr/share/man/man1/mdc2.1ssl.gz

/usr/share/man/man1/nseq.1ssl.gz

/usr/share/man/man1/ocsp.1ssl.gz

/usr/share/man/man1/openssl.1ssl.gz

/usr/share/man/man1/pkcs12.1ssl.gz

/usr/share/man/man1/pkcs7.1ssl.gz

/usr/share/man/man1/pkcs8.1ssl.gz

/usr/share/man/man1/pkey.1ssl.gz

/usr/share/man/man1/pkeyparam.1ssl.gz

/usr/share/man/man1/pkeyutl.1ssl.gz

/usr/share/man/man1/req.1ssl.gz

/usr/share/man/man1/ripemd160.1ssl.gz

/usr/share/man/man1/rsa.1ssl.gz

/usr/share/man/man1/rsautl.1ssl.gz

/usr/share/man/man1/s_client.1ssl.gz

/usr/share/man/man1/s_server.1ssl.gz

/usr/share/man/man1/s_time.1ssl.gz

/usr/share/man/man1/sess_id.1ssl.gz

/usr/share/man/man1/sha.1ssl.gz

/usr/share/man/man1/sha1.1ssl.gz

/usr/share/man/man1/sha224.1ssl.gz

/usr/share/man/man1/sha256.1ssl.gz

/usr/share/man/man1/sha384.1ssl.gz

/usr/share/man/man1/sha512.1ssl.gz

/usr/share/man/man1/smime.1ssl.gz

/usr/share/man/man1/speed.1ssl.gz

/usr/share/man/man1/spkac.1ssl.gz

/usr/share/man/man1/sslpasswd.1ssl.gz

/usr/share/man/man1/sslrand.1ssl.gz

/usr/share/man/man1/ts.1ssl.gz

/usr/share/man/man1/verify.1ssl.gz

/usr/share/man/man1/version.1ssl.gz

/usr/share/man/man1/x509.1ssl.gz

/usr/share/man/man5/config.5ssl.gz

/usr/share/man/man5/openssl.cnf.5ssl.gz

/usr/share/man/man5/x509v3_config.5ssl.gz

/usr/share/man/man7/des_modes.7ssl.gz

尝试了几个路径,例如SSL=/usr/lib64/openssl ,然后重新编译安装Python,发现依然报错,

[root@db-server Python-3.6.6]# vi Modules/Setup.dist

SSL=/usr/lib64/openssl

_ssl _ssl.c \

-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \

-L$(SSL)/lib -lssl -lcrypto

#cd /tmp/Python-3.6.6

#./configure --prefix=/usr/local

#make

#make install

在Python的解压安装包里面,我查了一下setup.py , 搜索ssl关键字,发现有如下一些代码, 但是我在系统搜索了一下,居然找不到这些目录(ssl/include和/ssl/lib)和ssl.h这些文件。

[root@db-server ~]# vi /tmp/Python-3.6.6/setup.py

    # Detect SSL support for the socket module (via _ssl)

        search_for_ssl_incs_in = [

                              '/usr/local/ssl/include',

                              '/usr/contrib/ssl/include/'

                             ]

        ssl_incs = find_file('openssl/ssl.h', inc_dirs,

                             search_for_ssl_incs_in

                             )

        if ssl_incs is not None:

            krb5_h = find_file('krb5.h', inc_dirs,

                               ['/usr/kerberos/include'])

            if krb5_h:

                ssl_incs += krb5_h

        ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,

                                     ['/usr/local/ssl/lib',

                                      '/usr/contrib/ssl/lib/'

                                     ] )

 

        if (ssl_incs is not None and

            ssl_libs is not None):

            exts.append( Extension('_ssl', ['_ssl.c'],

                                   include_dirs = ssl_incs,

                                   library_dirs = ssl_libs,

                                   libraries = ['ssl', 'crypto'],

                                   depends = ['socketmodule.h']), )

        else:

            missing.append('_ssl')

[root@db-server ~]# ls -lrt /usr/lib64/openssl

total 0

drwxr-xr-x. 2 root root 218 Sep 20 07:00 engines

 

[root@db-server ~]# ls /usr/local/ssl

ls: cannot access /usr/local/ssl: No such file or directory

 

[root@db-server ~]# find / -name ssl.h

后面才搞清楚,openssl包只包含了可执行部分,openssl-devel才包含了头文件、头文件参考、某些库文件等以及跟开发相关的东西。所以只安装了openssl包是找不到相应的头文件的,安装完openssl-devel之后,验证确认这些目录和文件已经存在了。

[root@db-server ~]# rpm -qa | grep openssl-devel

[root@db-server ~]# rpm -qa | grep openssl

openssl-1.0.2k-19.el7.x86_64

openssl-libs-1.0.2k-19.el7.x86_64

 

[root@db-server ~]# yum list installed |grep openssl-devel

[root@db-server ~]# yum list installed |grep openssl

openssl.x86_64                        1:1.0.2k-19.el7                  @base    

openssl-libs.x86_64                   1:1.0.2k-19.el7                  @base    

[root@db-server ~]# 

 

[root@db-server ~]# yum install openssl-devel

使用# rpm -ql  openssl-devel 定位安装安装路径为“/usr/include/openssl”,修改安装路径的Modules/Setup.dist文件,修改后的部分如下所示(对比上面截图),然后重新编译安装Python后问题彻底解决。

# Socket module helper for SSL support; you must comment out the other

# socket line above, and possibly edit the SSL variable:

SSL=/usr/include/openssl

_ssl _ssl.c \

-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \

-L$(SSL)/lib -lssl –lcrypto

 

 

参考资料:

https://www.cnblogs.com/minglee/p/9232673.html

Python升级后ssl模块不可用问题解决和浅析的更多相关文章

  1. CENTOS下Python 升级后YUM无法使用的解决办法

    Python有很多实用的工具,安装依赖python版本较高,升级Python后导致yum无法使用. 原因: 系统自带的yum依赖Python老版本,升级后不兼容 解决办法: 1. 列出所有版本,确定老 ...

  2. python升级后pip 不可用 卸载pip

    python版本由2.6升级到2.7之后,用pip提示报错 找了一下原因,网上的版本很多.弄来弄去比较麻烦 来点简单粗暴的 1.卸载pip yum remove python-pip 2.下载 cur ...

  3. Python3 ssl模块不可用的问题

    编译安装完Python3之后,使用pip来安装python库,发现了如下报错: $ pip install numpy pip is configured with locations that re ...

  4. 转 Python3 ssl模块不可用的问题

      编译安装完Python3之后,使用pip来安装python库,发现了如下报错:   $ pip install numpy pip is configured with locations tha ...

  5. 如何解决python升级后yum报错

    当我们yum命令的时候,会提示 "File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ^ SyntaxEr ...

  6. python升级后带来的几个小问题

    1)python升级带来的yum异常:File "/usr/bin/yum", line 30 原因:这是因为yum采用Python作为命令解释器,这可以从/usr/bin/yum ...

  7. CentOS更换python版本后,yum不可用的问题

    因为yum调用了python,他的启动程序/usr/bin/yum就是一个python脚本 yum是不兼容 Python 2.7的,所以yum不能正常工作,我们需要指定 yum 的Python版本 将 ...

  8. python 升级后正确安装 pip

    由于服务器的python 版本是2.6.6 , 为了使用 twisted 升级至 2.7.13 , 如果此时直接用 yum install python-pip 安装 pip, 则实际pip 会安装在 ...

  9. python安装完毕后,提示找不到ssl模块的解决步骤

    转载自 醇酒醉影 python安装完毕后,提示找不到ssl模块: [root@localhost ~]# python2.7.5 Python 2.7.5 (default, Jun 3 2013, ...

随机推荐

  1. java的传参究竟是按值传递的还是按引用传递的

    这里来弄清楚Java的传参究竟是按值传递的还是按引用传递的. 形参和实参 传参的概念里,有形参和实参的区分.形参是定义方法名和方法体的时候使用的参数,目的是用来接收调用该方法的时候传入的参数:实参是调 ...

  2. php 温故而知新 好久不用 又得继续学习下

    1.php注释:/* */.//.#等三种方式2.echo:向浏览器输出字符串,echo其实是一个函数:返回值:无3.print:向浏览器输出字符串,它也是一个函数:返回值:整型.           ...

  3. Python发送邮件以及对其封装

    对Python发送邮件进行封装 Python发送邮件分为四步 连接到smtp服务器 登陆smtp服务器 准备邮件 发送邮件 导入所需要的包 import smtplib from email.mime ...

  4. 【Flutter】372- Flutter移动端实战手册

    ☝点击上方蓝字,关注我们! 本文字数:3705字 预计阅读时间:28分钟 导 读 Flutter又双叒叕来了!本周推送是我们Flutter系列文章的最终篇!<Flutter移动端实战手册> ...

  5. Java题整

    Java面试题整 http://www.cnblogs.com/remember-forget/p/6140166.html 上:http://blog.csdn.net/jackfrued/arti ...

  6. python学习-list

    # 数据类型之 列表 有顺序.# 关键字:list# 语法 :[] 数据之间用,隔开.列表当中的数据,可以是任意类型.数值是可以重复的.a = []b = ["魔王", " ...

  7. MySQL高级查询之索引创建、删除、增加、修改、慢sql、explain解释sql

    day04数据库 昨日知识点回顾 1.单表操作 1.单表的操作 条件查询的优先级别: where > group by >having > order by > limit; ...

  8. ES6对数组的扩展(简要总结)

    文章目录 数组的扩展(ES6) 1. 扩展运算符 2. Array.from 3. Array.of() 4. copyWithin() 5. find() 和 findIndex() 6. fill ...

  9. 使用python实现哈希表、字典、集合

    哈希表 哈希表(Hash Table, 又称为散列表),是一种线性表的存储结构.哈希表由一个直接寻址表和一个哈希函数组成.哈希函数h(k)将元素关键字k作为自变量,返回元素的存储下标. 简单哈希函数: ...

  10. uni-app自定义app端的扫码界面

    记得当时是在西班牙有这样的一个需求,需要自定义扫码页面,还需要加上西班牙文,当时是在一个组件里面找到了这样的一个方法,全文大部分使用的app端的Native里面的方法,记录一下,跑路了项目代码要删库了 ...