為啥 PIP 安裝庫也會提示UnicodeDecodeError?
要不是今天心血來潮想寫篇文章,差點忘記自己還有個公眾號了。看了一下上次發(fā)文還是40天前,推掉了所有找我互推的、發(fā)廣告的后更文反而沒啥壓力了。
言歸正傳
UnicodeDecodeError 這個錯誤寫過python2的人肯定都被折磨過,關于這個錯誤的原因我曾經(jīng)寫過幾篇文章深入分析過,感興趣的可以搜索下歷史文章,其根本原因在于一段字符在不同地方之間的轉換用了錯誤的字符編碼導致的。就好比別人跟你說了一段英文,你非要以中文的方式去理解,你肯定聽不懂。
今天遇到個新問題,用pip安裝某個庫的時候竟然提示 UnicodeDecodeError: 'gbk' codec can't decode byte 0x8b in position 82: illegal multibyte sequence。
完整的錯誤

我是在下載一個叫 qcloud-python-sts 的庫,提示UnicodeDecodeError: 'gbk' codec can't decode byte, 問題也很好定位, 我們找到這個庫中 setup.py文件
#?coding=utf-8
from?setuptools?import?setup,?find_packages
with?open("README.md",?"r")?as?fh:
????long_description?=?fh.read()
根源就處在這里,他在讀一個叫 readme.md的文件時,剛好包含有中文, ?調(diào)用open方法讀取文件內(nèi)容時沒有顯式地指定讀取文件的編碼格式。那么python解釋器會默認使用系統(tǒng)本地的編碼格式,在Windows平臺就是gbk編碼。如果是Linux或者蘋果操作系統(tǒng)默認會使用UTF-8來讀取。
我猜測寫這個庫的作者就是在蘋果電腦上測試沒問題就發(fā)了,卻不知Windows上會報錯。
解決的辦法很簡單,就是在open函數(shù)里面顯式地指定編碼格式
with?open("README.md",?"r",?encoding='utf-8')?as?fh:
????long_description?=?fh.read()
可問題的關鍵是這個庫是別人寫的,我們只是通過pip下載安裝,你叫我咋改?要不然就是把這個庫copy一份到本地改了后在本地安裝。還有個辦法就是給作者提PR,然后就是漫長的等待。
如何在不改代碼的情況下讓這個包正常安裝上呢??如果是換電腦安裝未免代價有點大。
其實有個最簡單的辦法, 但僅限pyton3.7及以上版本。
python3.7提供了一個PYTHONUTF8的環(huán)境變量, 這個變量用來干啥的?你猜一猜估計也知道了。就是Python解釋器會根據(jù)這個環(huán)境變量來決定使用哪種編碼。?如果你設置成PYTHONUTF8的值為1, 他就會強制使用UTF8作為讀取文件的編碼而忽略本地的編碼格式。

設置完之后,重新打開cmd安裝,妥妥的解決。
Successfully?installed?qcloud-python-sts-3.1.1
