解決Python3.7.0 SSL低版本導(dǎo)致Pip無法使用問題
終于下決心把python從2.7升到了3.7。懶人安裝當(dāng)然使用Anaconda。
安裝成功,編譯成功。但是用pip 安裝包的時(shí)候提示:
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
進(jìn)入
Anaconda Prompt:
conda install -c anaconda openssl
就一切解決了哈啊哈!完美!
補(bǔ)充知識(shí):Python3使用multiprocessing多進(jìn)程模塊共享變量
在使用Python用CPU跑一個(gè)人臉識(shí)別的模塊,神經(jīng)網(wǎng)絡(luò)的計(jì)算比較耗時(shí),因?yàn)镻ython GIL的限制,因此這里使用多進(jìn)程來并行跑數(shù)據(jù)集。
在多個(gè)進(jìn)程之間共享簡單變量
有很多張人臉圖片,現(xiàn)在使用8個(gè)進(jìn)程來分別對人臉圖片進(jìn)行識(shí)別,但是要知道總的進(jìn)度和正確率,因此這里要在各個(gè)進(jìn)程之間共享變量。這里需要的只是整型無符號(hào)變量。
在對總的進(jìn)度和準(zhǔn)確率進(jìn)行計(jì)算的時(shí)候要加鎖,防止別的進(jìn)程改變
在使用 print輸出的時(shí)候要加鎖,因?yàn)榭刂婆_(tái)也是資源,要防止搶占
加鎖了之后要記得釋放鎖
假設(shè)8個(gè)進(jìn)程共識(shí)別了count張圖片,然后正確的圖片有correct張。思路如下:
在主進(jìn)程中聲明要共享的count和correct變量,初始化進(jìn)程的時(shí)候傳入
在各個(gè)進(jìn)程中識(shí)別一張圖片count就自增1,識(shí)別正確的話correct也要自增1,自增的時(shí)候要加鎖
控制臺(tái)輸出相關(guān)信息的時(shí)候也要加鎖
# l代表長整型無符號(hào)變量
count = multiprocessing.Value('l', 0)
correct = multiprocessing.Value('l', 0)
lock = multiprocessing.Lock()
# 要運(yùn)行的函數(shù)為run(),lis為劃分給每個(gè)進(jìn)程的識(shí)別圖片列表
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函數(shù)中:
# 多個(gè)線程對共享變量進(jìn)行操作,加鎖
lock.acquire()
# 圖片已經(jīng)識(shí)別完畢,總數(shù)加一
count.value += 1
# 下面兩個(gè)if分別為識(shí)別正確的情況
if i[0] == 3 and dis >= threshold:
correct.value += 1
print("正確率:{0:.5f} 總數(shù):{1} 正確數(shù):{2} 錯(cuò)誤數(shù):{3} 參數(shù)個(gè)數(shù):{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} 總數(shù):{1} 正確數(shù):{2} 錯(cuò)誤數(shù):{3} 參數(shù)個(gè)數(shù):{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("識(shí)別錯(cuò)誤:參數(shù)個(gè)數(shù):{0} 向量夾角:{1} 圖片1:{2} 圖片2:{3}".format(i[0], dis[0], i[1], i[2]))
# 不要遺漏解鎖,否則進(jìn)程會(huì)死鎖
lock.release()
在多個(gè)進(jìn)程中共享字典dict
準(zhǔn)備把識(shí)別過的照片特征緩存起來,因此這里使用字典,key就是照片名稱,value就是特征值。在此使用mutiprocessing.Manage()來實(shí)現(xiàn)。
manager = multiprocessing.Manager()
# 這個(gè)是用來在多個(gè)進(jìn)程中間共享的字典
sync_dict = manager.dict()
# 這個(gè)是使用pickle序列化到文件中用的臨時(shí)字典變量
mem_dict = dict()
# 如果存在字典就載入,使用臨時(shí)字典中轉(zhuǎn)是因?yàn)閟ysnc_dict直接序列化會(huì)在下次加載時(shí)導(dǎo)致Manager在多個(gè)進(jìn)程中的連接出現(xiàn)問題
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()時(shí)就不用加鎖了,它本身帶有同步的功能。在run函數(shù)中直接使用就好了。
if i[1] in sync_dict: # 有記錄就直接讀取緩存 encoding1 = sync_dict[i[1]] else: # 沒記錄就計(jì)算出來再緩存一下 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
如果緩存過就直接讀取,如果沒有緩存過就計(jì)算后然后再緩存一下,便于下次讀取。大多都是業(yè)務(wù)的邏輯,沒有什么意思。算完了之后在主程序退出之前再緩存到本地就好了。
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里面運(yùn)行代碼的時(shí)候會(huì)碰到一些問題。
使用Pycharm的Python console運(yùn)行代碼的時(shí)候會(huì)導(dǎo)致一個(gè)進(jìn)程完成任務(wù)之后,join等待主線程退出的時(shí)候,所有進(jìn)程都報(bào)錯(cuò)pipe broken連接不到Manager的共享字典。但是使用本地Terminal運(yùn)行的時(shí)候,一個(gè)進(jìn)程完成任務(wù)后是不會(huì)導(dǎo)致其他進(jìn)程報(bào)錯(cuò)的,因此推斷這里是Pycharm的坑。
關(guān)鍵字:multiprocessing.Manager()報(bào)錯(cuò)pipe broken,進(jìn)程獲取共享變量時(shí)異常,導(dǎo)致所有進(jìn)程退出
調(diào)試代碼(Pycharm debug模式)的時(shí)候也會(huì)導(dǎo)致調(diào)試過程中進(jìn)程連接不到Manager的共享字典變量。
這些坑都涉及到Manager在共享變量時(shí)使用的客戶端/服務(wù)端模式,最后socket連接報(bào)錯(cuò),所有進(jìn)程讀取共享變量時(shí)報(bào)錯(cuò)退出。我這次的解決方式是不要啟用Pycharm的Python console來運(yùn)行代碼就好了。
以上這篇解決Python3.7.0 SSL低版本導(dǎo)致Pip無法使用問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python PyMySQL操作MySQL數(shù)據(jù)庫的方法詳解
PyMySQL是一個(gè)用于Python編程語言的純Python MySQL客戶端庫,它遵循Python標(biāo)準(zhǔn)DB API接口,并提供了許多方便的功能,本文就來和大家簡單介紹一下吧2023-05-05
Python實(shí)現(xiàn)Windows上氣泡提醒效果的方法
這篇文章主要介紹了Python實(shí)現(xiàn)Windows上氣泡提醒效果的方法,涉及Python針對windows窗口操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06

