要不是今天心血来潮想写撸篇文章,差点忘记自己还有个公众号了。看了一下上次发文还是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,然后就是漫长的等待。
如何在不改代码的情况下让这个包正常安装上呢? 如果是换电脑安装未免代价有点大,你叫那些手上没有mac的情何以堪。
其实有个最简单的办法, 但仅限pyton3.7及以上版本。
python3.7提供了一个PYTHONUTF8的环境变量, 这个变量用来干啥的?你猜一猜估计也知道了。就是Python解释器会根据这个环境变量来决定使用哪种编码。 如果你设置成PYTHONUTF8的值为1, 他就会强制使用UTF8作为文件系统的编码而忽略本地的编码格式。
设置完之后,重新打开cmd安装,妥妥的解决。
Successfully installed qcloud-python-sts-3.1.1
关注公众号「Python之禅」,回复「1024」免费获取Python资源