6

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

 2 years ago
source link: https://foofish.net/python-pip-unicodedecoderrror.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK