解決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ǔ)充知識:Python3使用multiprocessing多進(jìn)程模塊共享變量
在使用Python用CPU跑一個(gè)人臉識別的模塊,神經(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)行識別,但是要知道總的進(jìn)度和正確率,因此這里要在各個(gè)進(jìn)程之間共享變量。這里需要的只是整型無符號變量。
在對總的進(jìn)度和準(zhǔn)確率進(jìn)行計(jì)算的時(shí)候要加鎖,防止別的進(jìn)程改變
在使用 print輸出的時(shí)候要加鎖,因?yàn)榭刂婆_也是資源,要防止搶占
加鎖了之后要記得釋放鎖
假設(shè)8個(gè)進(jìn)程共識別了count張圖片,然后正確的圖片有correct張。思路如下:
在主進(jìn)程中聲明要共享的count和correct變量,初始化進(jìn)程的時(shí)候傳入
在各個(gè)進(jìn)程中識別一張圖片count就自增1,識別正確的話correct也要自增1,自增的時(shí)候要加鎖
控制臺輸出相關(guān)信息的時(shí)候也要加鎖
# l代表長整型無符號變量 count = multiprocessing.Value('l', 0) correct = multiprocessing.Value('l', 0) lock = multiprocessing.Lock() # 要運(yùn)行的函數(shù)為run(),lis為劃分給每個(gè)進(jìn)程的識別圖片列表 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ù)加一 count.value += 1 # 下面兩個(gè)if分別為識別正確的情況 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("識別錯(cuò)誤:參數(shù)個(gè)數(shù):{0} 向量夾角:{1} 圖片1:{2} 圖片2:{3}".format(i[0], dis[0], i[1], i[2])) # 不要遺漏解鎖,否則進(jìn)程會死鎖 lock.release()
在多個(gè)進(jìn)程中共享字典dict
準(zhǔn)備把識別過的照片特征緩存起來,因此這里使用字典,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直接序列化會在下次加載時(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í)候會碰到一些問題。
使用Pycharm的Python console運(yùn)行代碼的時(shí)候會導(dǎo)致一個(gè)進(jìn)程完成任務(wù)之后,join等待主線程退出的時(shí)候,所有進(jìn)程都報(bào)錯(cuò)pipe broken連接不到Manager的共享字典。但是使用本地Terminal運(yùn)行的時(shí)候,一個(gè)進(jìn)程完成任務(wù)后是不會導(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í)候也會導(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 logging 日志的級別調(diào)整方式
今天小編就為大家分享一篇python logging 日志的級別調(diào)整方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python使用urllib2模塊實(shí)現(xiàn)斷點(diǎn)續(xù)傳下載的方法
這篇文章主要介紹了Python使用urllib2模塊實(shí)現(xiàn)斷點(diǎn)續(xù)傳下載的方法,實(shí)例分析了urllib2模塊的使用及斷點(diǎn)續(xù)傳下載的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-06-06Python使用psutil對系統(tǒng)數(shù)據(jù)進(jìn)行采集監(jiān)控
psutil庫可以實(shí)時(shí)獲取系統(tǒng)的一些信息,這樣就可以達(dá)到實(shí)時(shí)監(jiān)控系統(tǒng)的目的。本文對詳細(xì)講解了ython使用psutil對系統(tǒng)數(shù)據(jù)進(jìn)行采集監(jiān)控,感興趣的朋友可以看一看2021-08-08Python 獲取div標(biāo)簽中的文字實(shí)例
今天小編就為大家分享一篇Python 獲取div標(biāo)簽中的文字實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python標(biāo)準(zhǔn)庫之多進(jìn)程(multiprocessing包)介紹
這篇文章主要介紹了Python標(biāo)準(zhǔn)庫之多進(jìn)程(multiprocessing包)介紹,本文講解了進(jìn)程池、共享資源、共享內(nèi)存、Manager等內(nèi)容,需要的朋友可以參考下2014-11-11Pygame游戲開發(fā)之太空射擊實(shí)戰(zhàn)碰撞改進(jìn)篇
相信大多數(shù)8090后都玩過太空射擊游戲,在過去游戲不多的年代太空射擊自然屬于經(jīng)典好玩的一款了,今天我們來自己動(dòng)手實(shí)現(xiàn)它,在編寫學(xué)習(xí)中回顧過往展望未來,在本課中,我們將討論如何更改?Pygame?處理精靈之間沖突的方式2022-08-08Python中eval帶來的潛在風(fēng)險(xiǎn)代碼分析
這篇文章主要介紹了Python中eval帶來的潛在風(fēng)險(xiǎn)代碼分析,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12