终于下决心把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无法使用问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

python3.7不能用_解决Python3.7.0 SSL低版本导致Pip无法使用问题相关推荐

  1. python3中map函数_解决Python3下map函数的显示问题

    map函数是Python里面比较重要的函数,设计灵感来自于函数式编程.Python官方文档中是这样解释map函数的: map(function, iterable, ...) Return an it ...

  2. 笨办法学python3 pdf 脚本之家_解决python3输入的坑——input()

    如下所示: a,b,c,d = input() 很简单的代码,如果输入为 1 -1 -2 3 结果会报错,原因在于input函数会将你的输入作为python脚本运行,那么输入就变成了 1-1 -2 3 ...

  3. python numpy安装失败_解决python3.x安装numpy成功但import出错的问题

    问题描述 windows错误安装方法: pip3 install numpy 这种情况下虽然安装成功,但是在import numpy时会出现如下错误. import numpy ** on entry ...

  4. python有中文无法保存_解决python3爬虫无法显示中文的问题

    解决python3爬虫无法显示中文的问题 有时候使用python从网站上爬数据的时候,如果数据里包含中文,有时候显示的却是如下所示...\xe4\xba\xba\xef\xbc\x8c\xe6...类 ...

  5. pythonurllib2方法_解决python3.6想使用urllib2包的方法

    解决python3.6想使用urllib2包的方法 发布时间:2020-08-11 14:24:50 来源:亿速云 阅读:131 作者:小新 小编给大家分享一下解决python3.6想使用urllib ...

  6. python3输出中文_解决Python3用PIL的ImageFont输出中文乱码的问题

    今天在用python3+ImageFont输出中文时,结果显示乱码 # coding:utf-8 from PIL import Image, ImageDraw, ImageFont image= ...

  7. python3.6字典有序_为什么Python3.6字典变得有序了?

    原博文 2019-12-25 16:09 − 其实 在你看了笔者的文章之前,或许想过这样一个问题, 为什么列表是有顺序的呢?而字典不是? 来看一下在内存中是怎样存储的就知道了: 列表的存储是顺序存储, ...

  8. python变量初始化的位置不当、程序结果可能会出现问题_解决tensorflow由于未初始化变量而导致的错误问题...

    我写的这个程序 import tensorflow as tf sess=tf.InteractiveSession() x=tf.Variable([1.0,2.0]) a=tf.constant( ...

  9. mysql my.ini位置错误_解决mysql导入数据量很大导致失败及查找my.ini 位置(my.ini)在哪...

    数据库数据量很大的数据库导入到本地时,会等很久,然而等很久之后还是显示失败: 这是就要看看自己本地的没mysql是否设置了超时等待,如果报相关time_out这些,可以把mysql.ini尾部添加ma ...

最新文章

  1. Waymo无人卡车高调重返凤凰城,但货运先机已失
  2. SQL注入测试平台 SQLol -6.CHALLENGES挑战
  3. MSI-X 之有别于MSI
  4. Win XP2实用的修复工具
  5. mybatisGenerator 代码自动生成报错 Result Maps collection already contains value for BaseResultMap...
  6. java 传递bean_Java:如何将值从类/ bean传递给servlet
  7. MySQL高并发事务问题
  8. 微课|中学生可以这样学Python(6.3节):变量作用域
  9. ubuntu下qt+科大讯飞语音库的导入方法
  10. tomcat配置war包解压地址
  11. iOS——UINavigationController简单实用以及内存警告处理过程
  12. IDEA项目包的导入以及压缩包的快速导出
  13. 全国应用计算机水平考试,全国计算机应用水平考试
  14. 爱创课堂分享web前端学习路线自学如何找到工作
  15. SmallTalkEDI程序
  16. 美军用机器人将超士兵数量 10个机器人1名士兵
  17. 达梦数据库linux安装
  18. linux ftp cmd被动模式,如何在Windows命令提示符下使用被动FTP模式?
  19. GD32f303 flash加密
  20. angular 判断字符串为空_总结:44个Python3字符串内置方法大全及示例

热门文章

  1. 【Kafka】Could not find or load main class kafka.tools.ConsumerOffsetChecker
  2. 【IDEA】IDEA 单元测试 System.in 没办法输入
  3. 启动Spark出现Operation category READ is not supported in state standby
  4. Spark杀死我们提交的application
  5. SparkStreaming之transform
  6. spark学习-75-源代码:Endpoint模型介绍(6)-Endpoint的消息的接收(2)
  7. SecureCRT-SecureCRT如何保存界面的日志信息
  8. 【Spring】Spring 父子容器
  9. 【SpringMVC】SpringMVC+Spring+hibernate整合
  10. 新建远程仓库并推送项目