为啥 PIP 安装库也会提示UnicodeDecodeError?
共 1314字,需浏览 3分钟
·
2022-05-23 20:19
要不是今天心血来潮想写篇文章,差点忘记自己还有个公众号了。看了一下上次发文还是40天前,推掉了所有找我互推的、发广告的后更文反而没啥压力了。
言归正传
UnicodeDecodeError 这个错误写过python2的人肯定都被折磨过,关于这个错误的原因我曾经写过几篇文章深入分析过,感兴趣的可以搜索下历史文章,其根本原因在于一段字符在不同地方之间的转换用了错误的字符编码导致的。就好比别人跟你说了一段英文,你非要以中文的方式去理解,你肯定听不懂。
今天遇到个新问题,用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
的文件时,刚好包含有中文, 调用open
方法读取文件内容时没有显式地指定读取文件的编码格式。那么python解释器会默认使用系统本地的编码格式,在Windows平台就是gbk编码。如果是Linux或者苹果操作系统默认会使用UTF-8来读取。
我猜测写这个库的作者就是在苹果电脑上测试没问题就发了,却不知Windows上会报错。
解决的办法很简单,就是在open函数里面显式地指定编码格式
with open("README.md", "r", encoding='utf-8') as fh:
long_description = fh.read()
可问题的关键是这个库是别人写的,我们只是通过pip下载安装,你叫我咋改?要不然就是把这个库copy一份到本地改了后在本地安装。还有个办法就是给作者提PR,然后就是漫长的等待。
如何在不改代码的情况下让这个包正常安装上呢? 如果是换电脑安装未免代价有点大。
其实有个最简单的办法, 但仅限pyton3.7及以上版本。
python3.7提供了一个PYTHONUTF8的环境变量, 这个变量用来干啥的?你猜一猜估计也知道了。就是Python解释器会根据这个环境变量来决定使用哪种编码。 如果你设置成PYTHONUTF8的值为1, 他就会强制使用UTF8作为读取文件的编码而忽略本地的编码格式。
设置完之后,重新打开cmd安装,妥妥的解决。
Successfully installed qcloud-python-sts-3.1.1