解决Python3.7.0 SSL低版本导致Pip无法使用问题


Posted in Python onSeptember 03, 2020

终于下决心把python从2.7升到了3.7。懒人安装当然使用Anaconda。

安装成功,编译成功。但是用pip 安装包的时候提示:

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

原因是python3.7为了安全性考虑,要求使用openssl 1.0.2之后的版本。但是自带的openssl,版本是1.0.1。

解决办法:

重装一下openssl

进入

Anaconda Prompt:

conda install -c anaconda openssl

就一切解决了哈啊哈!完美!

补充知识:Python3使用multiprocessing多进程模块共享变量

在使用Python用CPU跑一个人脸识别的模块,神经网络的计算比较耗时,因为Python GIL的限制,因此这里使用多进程来并行跑数据集。

在多个进程之间共享简单变量

有很多张人脸图片,现在使用8个进程来分别对人脸图片进行识别,但是要知道总的进度和正确率,因此这里要在各个进程之间共享变量。这里需要的只是整型无符号变量。

在对总的进度和准确率进行计算的时候要加锁,防止别的进程改变

在使用 print输出的时候要加锁,因为控制台也是资源,要防止抢占

加锁了之后要记得释放锁

假设8个进程共识别了count张图片,然后正确的图片有correct张。思路如下:

在主进程中声明要共享的count和correct变量,初始化进程的时候传入

在各个进程中识别一张图片count就自增1,识别正确的话correct也要自增1,自增的时候要加锁

控制台输出相关信息的时候也要加锁

# l代表长整型无符号变量
count = multiprocessing.Value('l', 0)
correct = multiprocessing.Value('l', 0)
lock = multiprocessing.Lock()

# 要运行的函数为run(),lis为划分给每个进程的识别图片列表
p = [multiprocessing.Process(target=run, args=(lock, i, count, correct)) for i in lis]

for i in p:
  i.start()
for i in p:
  i.join()

在run函数中:

# 多个线程对共享变量进行操作,加锁
lock.acquire()
# 图片已经识别完毕,总数加一
count.value += 1
# 下面两个if分别为识别正确的情况
if i[0] == 3 and dis >= threshold:
  correct.value += 1
  print("正确率:{0:.5f} 总数:{1} 正确数:{2} 错误数:{3} 参数个数:{4} 向量夹角:{5:.5f} 图片1:{6} 图片2:{7}".format(correct.value/count.value, count.value, correct.value, count.value-correct.value, i[0], dis[0], i[1], i[2]))
  lock.release()
  continue
if i[0] == 4 and dis < threshold:
  correct.value += 1
  print("正确率:{0:.5f} 总数:{1} 正确数:{2} 错误数:{3} 参数个数:{4} 向量夹角:{5:.5f} 图片1:{6} 图片2:{7}".format(correct.value/count.value, count.value, correct.value, count.value-correct.value, i[0], dis[0], i[1], i[2]))
  lock.release()
  continue
print("识别错误:参数个数:{0} 向量夹角:{1} 图片1:{2} 图片2:{3}".format(i[0], dis[0], i[1], i[2]))
# 不要遗漏解锁,否则进程会死锁
lock.release()

在多个进程中共享字典dict

准备把识别过的照片特征缓存起来,因此这里使用字典,key就是照片名称,value就是特征值。在此使用mutiprocessing.Manage()来实现。

manager = multiprocessing.Manager()
# 这个是用来在多个进程中间共享的字典
sync_dict = manager.dict()
# 这个是使用pickle序列化到文件中用的临时字典变量
mem_dict = dict()

# 如果存在字典就载入,使用临时字典中转是因为sysnc_dict直接序列化会在下次加载时导致Manager在多个进程中的连接出现问题
if os.path.exists("./muti_thread_mem.pkl"):
  with open("./muti_thread_mem.pkl", "rb") as f:
    mem_dict = pickle.load(f)
  for i in mem_dict:
    sync_dict[i] = mem_dict[i]

使用multiprocessing.Manager()时就不用加锁了,它本身带有同步的功能。在run函数中直接使用就好了。

if i[1] in sync_dict:
 # 有记录就直接读取缓存
  encoding1 = sync_dict[i[1]]
else:
 # 没记录就计算出来再缓存一下
  face.file = Image.open(prefix+i[1])
  encoding1 = face.encodings
  sync_dict[i[1]] = encoding1
if i[2] in sync_dict:
  encoding2 = sync_dict[i[2]]
else:
  face.file = Image.open(prefix+i[2])
  encoding2 = face.encodings
  sync_dict[i[2]] = encoding2

如果缓存过就直接读取,如果没有缓存过就计算后然后再缓存一下,便于下次读取。大多都是业务的逻辑,没有什么意思。算完了之后在主程序退出之前再缓存到本地就好了。

with open("./muti_thread_mem.pkl", 'wb') as f:
  for k, v in enumerate(sync_dict):
    mem_dict[v] = sync_dict[v]
  if len(mem_dict):
   # 传入的4就是想试一下Python新版本的特性而已,没啥其他意思
    pickle.dump(mem_dict, f, 4)

在Pycharm里面运行代码的时候会碰到一些问题。

使用Pycharm的Python console运行代码的时候会导致一个进程完成任务之后,join等待主线程退出的时候,所有进程都报错pipe broken连接不到Manager的共享字典。但是使用本地Terminal运行的时候,一个进程完成任务后是不会导致其他进程报错的,因此推断这里是Pycharm的坑。

关键字:multiprocessing.Manager()报错pipe broken,进程获取共享变量时异常,导致所有进程退出

调试代码(Pycharm debug模式)的时候也会导致调试过程中进程连接不到Manager的共享字典变量。

这些坑都涉及到Manager在共享变量时使用的客户端/服务端模式,最后socket连接报错,所有进程读取共享变量时报错退出。我这次的解决方式是不要启用Pycharm的Python console来运行代码就好了。

以上这篇解决Python3.7.0 SSL低版本导致Pip无法使用问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python测试驱动开发实例
Oct 08 Python
python中os操作文件及文件路径实例汇总
Jan 15 Python
Python正则捕获操作示例
Aug 19 Python
python批量设置多个Excel文件页眉页脚的脚本
Mar 14 Python
python实现五子棋小游戏
Mar 25 Python
python批量创建指定名称的文件夹
Mar 21 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
Python模块future用法原理详解
Jan 20 Python
Keras在训练期间可视化训练误差和测试误差实例
Jun 16 Python
PyCharm 光标变成黑块的解决方式
Feb 06 Python
pytest进阶教程之fixture函数详解
Mar 29 Python
pytest配置文件pytest.ini的详细使用
Apr 17 Python
一篇文章搞懂python的转义字符及用法
Sep 03 #Python
容易被忽略的Python内置类型
Sep 03 #Python
python类共享变量操作
Sep 03 #Python
Python pip install之SSL异常处理操作
Sep 03 #Python
详解python tkinter 图片插入问题
Sep 03 #Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
Sep 03 #Python
PyTorch中Tensor的数据类型和运算的使用
Sep 03 #Python
You might like
我的论坛源代码(二)
2006/10/09 PHP
ThinkPHP之R方法实例详解
2014/06/20 PHP
laravel 4安装及入门图文教程
2014/10/29 PHP
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
非常实用的vue导航钩子
2017/03/20 Javascript
详解用node搭建简单的静态资源管理器
2017/08/09 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
vue实现动态按钮功能
2019/05/13 Javascript
[42:23]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第二场 12.10
2020/12/13 DOTA
[49:31]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第二场 1月29日
2021/03/11 DOTA
zookeeper python接口实例详解
2018/01/18 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
Numpy中转置transpose、T和swapaxes的实例讲解
2018/04/17 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
2019/06/17 Python
利用ImageAI库只需几行python代码实现目标检测
2019/08/09 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
一道SQL面试题
2012/12/31 面试题
Weblogic和WebSphere不同特点
2012/05/09 面试题
户外婚礼策划方案
2014/02/08 职场文书
迎国庆演讲稿
2014/09/05 职场文书
认错检讨书
2014/10/02 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书
大学生受助感言
2015/08/01 职场文书
2016年小学生新年寄语
2015/08/18 职场文书
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript