为啥用 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之禅

猜你喜欢

2024-03-04
Python中的 if __name__ == '__main__' 是什么?
2024-03-04
用 Python 破解隔壁老王家的 Wi-Fi 密码,刺激!
2023-06-12
Python3.12新特性
2023-04-17
Python虚拟环境使用
2023-04-15
如何删除macOS系统默认的Python2.7并替换成最新版python3.11
2022-12-09
python 中return和yield有什么区别
2022-08-17
如何利用多态干掉 if else 语句
2022-07-22
10个python初学者常犯的错误
2022-06-10
flask-siwadoc 支持openapi 分组功能
2022-06-10
在Python应用中Telegram 机器人搭建消息提醒