最近在离线的服务器上部署MrDoc的项目,项目是以 Django 开发的 知识管理系统,属于开源项目目前还在持续维护中,期望打造以python为基础语言的企业知识管理系统,类似于市场上的 wiki 等
部署时,因为服务器是离线状态,所有的包都需要手动编译安装,于是在安装了python3.6.4 和 一些依赖包后 ,启动项目,
先报了一个这个错误:
ImportError: No module named _ssl
【分析原因】出现此错误是python的基础包没有安装好,需要重新安装openssl后,再重新编译安装python
经过百度和论坛查找后发现 是因为 openssl 模块的问题,于是找到以下几种解决方案,实测有效:
https://blog.csdn.net/onebigday/article/details/104672350
https://www.cnblogs.com/mqxs/p/9103031.html
https://blog.csdn.net/xiemanR/article/details/85224509
https://blog.csdn.net/qq_33811662/article/details/80224060
--------------------------------------------我是分隔线,以下是原文---------------------------------------------------------------
笔者在 centos6.5
安装 python3.7
碰到此问题,安装好以后,执行 python3.7
命令行,import ssl
出现错误 ImportError: No module named _ssl
。 该错误表现在 pip install
时会报 pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
在网上找了很多资料,经过验证,在编译前修改 python
源码的方式(Modules/Setup.dist)
是不奏效的。 升级 openssl
到 1.1.x
之后的版本是有效的。
openssl 官方下载地址:https://www.openssl.org/source/
我当时安装的版本是: openssl-1.1.1c
-
-
tar xf openssl-1.1.1c.tar.gz
-
cd openssl-1.1.1c
-
./config --prefix=/usr/local/openssl-1.1.1c
-
make
-
make install
-
'''新建文件'''
-
vim /etc/ld.so.conf.d/openssl.conf
-
-
'''填入如下内容'''
-
/usr/local/openssl-1.1.1c/lib/
-
-
'''保存'''
-
-
'''更新共享库'''
-
ldconfig
-
-
'''检验 openssl-1.1.1 是否已加入共享库'''
-
ldconfig -v | grep ssl
-
-
/usr/local/openssl-1.1.1c/lib:
-
libssl.so.1.1 -> libssl.so.1.1 '''有这个表示加成功了'''
-
libssl3.so -> libssl3.so
-
libssl.so.10 -> libssl.so.1.0.1e
-
cd /usr/local/python3.7/
-
./configure --prefix=/usr/local/python3.7 --with-openssl=/usr/local/openssl-1.1.1c
-
make && make install
【以上解决思路是对的,只是在具体操作上有些区别】
------------------------------------------------------------------------------------------------------------------------
后来在运行中又报了以下错误:
ValueError : unsupported hash type
【分析原因】hashlib包太旧支持的类型不够,而安装python时,也没有将新的hashlib库关联过来;
通过查找发现 hashlib 是openssl相关的方法,也就是说是openssl安装的有问题导致的,据我推测应该是版本不匹配吧,但是最终也没找到根本问题,但是搜集几个解决办法如下,感觉思路是正确的,但是没有成功:
https://blog.csdn.net/yihui8/article/details/22163351
https://stackoverflow.com/questions/11433108/unsupported-hash-type-when-installing-plone
【总结】以上这些问题在联网下一般不会出现,因为联网安装 会自动匹配最合适的依赖,不会产生手动安装不匹配的问题;
【最终解决方案】
当以上方法解决均无效时,重新起看了一下python官网,突然发现:
Python 3.7.4 发布,内置的 OpenSSL 已升级至 1.1.1
也就是说,我最终的解决目的就是将python关联的openssl版本提升至1.1.1来支持更多的哈希类型
https://www.oschina.net/news/108148/python-3-7-4-eleased
------------------------------------------------------------------------------------------------------------------------------
Python 3.7.4 已发布,这是 3.7 系列的第四个也是最新的维护版本。Python 3.7 同时也是 Python 最新的主要版本,包含许多新功能和优化,详细内容请点此查看。
3.7.4 主要变化如下
面向 Windows 用户
- OpenSSL 已从 1.1.0 升级至 1.1.1,SQLite 也已升级至 3.28.0
- 面向 AMD64 设备的二进制文件也适用于实现了 Intel 64 架构的处理器。(也被称为"x64"架构,曾被称为"EM64T"和"x86-64")
- 现已面向 Windows 平台提供基于 Web 的安装程序,安装程序会在安装时下载所需的组件
- ……
面向 macOS 用户
- OpenSSL 已从 1.1.0 升级至 1.1.1,SQLite 也已升级至 3.28.0
- 对于 Python 3.7.4,官方提供了两个二进制安装包供选择下载。默认变体仅提供 64 位版本,并运行在 macOS 10.9 及更高的版本上
- 两个 python.org 安装程序变体均包含私有的 OpenSSL 副本。请仔细阅读安装期间显示的重要信息,以获取有关 SSL/TLS 证书认证和 Install Certificates.command 的信息
相关链接
于是我下载了 python3.7.7.tar.xz 在服务器上编译安装后,不再出现 以上2个问题!!!
总的来说还是对linux不熟悉,导致一些操作事与愿违,有待加强学习