为啥用 PIP 安装库也会提示UnicodeDecodeError?

By 刘志军, 2022-05-21, 分类: PYTHON技术

python

要不是今天心血来潮想写撸篇文章,差点忘记自己还有个公众号了。看了一下上次发文还是40天前,推掉了所有找我互推的、发广告的后更文反而没啥压力了。

言归正传

UnicodeDecodeError 这个错误写过python2的人肯定都被折磨过,关于这个错误的原因我曾经写过几篇文章深入的分析过,感兴趣的可以搜索下历史文章,其根本原因在于一段字符之间的转换用了错误的字符编码导致的。 就好比别人跟你说了一段英文,你非要以中文的方式去理解,你肯定听不懂。

今天遇到个新问题,用pip安装某个库的时候竟然提示 UnicodeDecodeError: 'gbk' codec can't decode byte 0x8b in position 82: illegal multibyte sequence。

完整的错误

微信截图_20220521091157.png

我在下载一个叫 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作为文件系统的编码而忽略本地的编码格式。

微信截图_20220521085323.png

设置完之后,重新打开cmd安装,妥妥的解决。

Successfully installed qcloud-python-sts-3.1.1

有问题可以扫描二维码和我交流

关注公众号「Python之禅」,回复「1024」免费获取Python资源

python之禅

猜你喜欢

2015-12-24
Python字典对象实现原理
2017-12-26
5个酷毙的Python工具
2018-10-15
提升逼格的两个函数:setdefault 与 defaultdict
2014-02-10
python 函数式编程处理函数:map(),filter(),reduce()
2017-09-01
关于操作 Python 列表最常见的10个问答
2020-06-07
求求你,别再手工造假数据了,fake了解一下
2019-05-12
Python 字符串转日期时间
2020-06-02
用python创建csv表格文件
2016-09-18
分析urllib.unquote乱码的原因
2017-06-29
for循环在Python中是怎么工作的