关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题


Posted in Python onNovember 24, 2020

有的bug,莫名其妙就好了…

python3.9 报错 “AttributeError: 'HTMLParser' object has no attribute 'unescape'” 异常分析解决。

一、问题描述

安装 python3.9 版本后,pycharm 中切换 python3.9 版本,创建虚拟环境报错:"AttributeError: 'HTMLParser' object has no attribute 'unescape'"。

Executed command:
C:\Users\三水点靠木\AppData\Local\Temp\tmp41_yhcxspycharm-management\setuptools-40.8.0\setup.py install

Error occurred:
AttributeError: 'HTMLParser' object has no attribute 'unescape'

Command output:
Traceback (most recent call last):
File "C:\Users\三水点靠木\AppData\Local\Temp\tmp0mv4mj35pycharm-management\setuptools-40.8.0\setup.py", line 11, in <module>
import setuptools
File "C:\Users\三水点靠木\AppData\Local\Temp\tmp0mv4mj35pycharm-management\setuptools-40.8.0\setuptools\__init__.py", line 20, in <module>
from setuptools.dist import Distribution, Feature
File "C:\Users\三水点靠木\AppData\Local\Temp\tmp0mv4mj35pycharm-management\setuptools-40.8.0\setuptools\dist.py", line 35, in <module>
from setuptools.depends import Require
File "C:\Users\三水点靠木\AppData\Local\Temp\tmp0mv4mj35pycharm-management\setuptools-40.8.0\setuptools\depends.py", line 7, in <module>
from .py33compat import Bytecode
File "C:\Users\三水点靠木\AppData\Local\Temp\tmp0mv4mj35pycharm-management\setuptools-40.8.0\setuptools\py33compat.py", line 55, in <module>
unescape = getattr(html, 'unescape', html_parser.HTMLParser().unescape)
AttributeError: 'HTMLParser' object has no attribute 'unescape'

查看官网 python3.9changelog,发现 HTMLParser.unescape 属性被移除了,并且从 python3.4 开始就被弃用。

关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题

pycharm 创建虚拟环境时,会使用到 setuptools。而 setuptools 中,刚好使用了这个属性,所以,导致了"AttributeError: 'HTMLParser' object has no attribute 'unescape'"异常。

经过各种分析、尝试,问题最终得到解决。记录下过程,避免更多人踩坑。

二、解决方法

先给出解决方法,感兴趣的朋友,可以继续阅读后面的分析部分。

解决这个问题,分两种情况:

1. 不通过 pycharm 编辑器,直接使用 python 解释器。
2. 在 pycharm 编辑器中使用 python 解释器。

我是在 pycharm 中使用 python3.9 触发报错,所以这里也单独提出来讨论讨论。

2.1、直接使用 python 解释器

不通过 pycharm 编辑器,直接使用 python 解释器。比如,在 windowscmd ,或 linux 下的命令行中使用 python

解决方法:更新 setuptools 版本。
我以 python3.9 使用 setuptools 为例,测试如下。

2.1.1、setuptools 低版本触发报错

setuptools-40.8.0 为例,测试触发报错如下:

第一步,使用 python3.9 下的 pip 卸载之前安装的 setuptools:

E:\soft\python\python39\install>pip uninstall setuptools

第二步,安装 setuptools-40.8.0

E:\soft\python\python39\install>pip install setuptools==40.8.0
Collecting setuptools==40.8.0
 Using cached setuptools-40.8.0-py2.py3-none-any.whl (575 kB)
Installing collected packages: setuptools
Successfully installed setuptools-40.8.0

第三步,在 python3.9 中导入包触发报错:

E:\soft\python\python39\install>python
Python 3.9.0 (tags/v3.9.0:9cf6752, Oct 5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import setuptools
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "E:\soft\python\python39\install\lib\site-packages\setuptools\__init__.py", line 20, in <module>
from setuptools.dist import Distribution, Feature
File "E:\soft\python\python39\install\lib\site-packages\setuptools\dist.py", line 35, in <module>
from setuptools.depends import Require
File "E:\soft\python\python39\install\lib\site-packages\setuptools\depends.py", line 7, in <module>
from .py33compat import Bytecode
File "E:\soft\python\python39\install\lib\site-packages\setuptools\py33compat.py", line 55, in <module>
unescape = getattr(html, 'unescape', html_parser.HTMLParser().unescape)
AttributeError: 'HTMLParser' object has no attribute 'unescape'

2.1.2、setuptools 高版本解决报错

setuptools-49.2.1 为例,测试如下:

第一步,卸载之前安装的 setuptools:

E:\soft\python\python39\install>pip uninstall setuptools
Found existing installation: setuptools 40.8.0
Uninstalling setuptools-40.8.0:
 Would remove:
 e:\soft\python\python39\install\lib\site-packages\easy_install.py
 e:\soft\python\python39\install\lib\site-packages\pkg_resources\*
 e:\soft\python\python39\install\lib\site-packages\setuptools-40.8.0.dist-info\*
 e:\soft\python\python39\install\lib\site-packages\setuptools\*
 e:\soft\python\python39\install\scripts\easy_install-3.9.exe
 e:\soft\python\python39\install\scripts\easy_install.exe
Proceed (y/n)? y
 Successfully uninstalled setuptools-40.8.0

第二步,安装 setuptools==49.2.1:

E:\soft\python\python39\install>pip install setuptools==49.2.1
Collecting setuptools==49.2.1
 Using cached setuptools-49.2.1-py3-none-any.whl (789 kB)
Installing collected packages: setuptools
Successfully installed setuptools-49.2.1

第三步,在 python3.9 中导入包:

E:\soft\python\python39\install>python
Python 3.9.0 (tags/v3.9.0:9cf6752, Oct 5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import setuptools
>>> setuptools.__version__
'49.2.1'
>>>

目前最新版本,应该是到 setuptools-50.3.2 了 。

2.2、在 pycharm 中使用 python 解释器

pycharm 中创建 python3.9 虚拟环境报错,本质上也是使用了 setuptools 的低版本导致。
我尝试过更新 setuptools 为更高的版本,但 pycharm 还是顽固的使用了 setuptools-40.8.0,如最开始的报错信息所示…

我不知道是 pycharm 中的某些默认配置导致,还是 pycharm 的版本属性导致它使用了低版本的 setuptools,如果有朋友知道,欢迎告知。

虽然,不知道 pycharm 中选择低版本 setuptools 的原因。这里,也简单提供两种解决方法吧~

2.2.1、virtualenv 创建虚拟环境

virtualenv 为应用提供隔离的 Python 运行环境,可以解决不同应用间多版本 python 的冲突问题。

利用 virtualenv 创建虚拟环境后,pycharm 中创建虚拟环境时,选择已存在的虚拟环境,可以避开报错。

第一步: 确认 python3.9 对应的 pip 工具。
如果没有配环境变量,可以直接从安装路径下打开 cmd 工具。一般在 python 安装目录下的 Scripts 文件夹内。使用 pip -V 可以查看 pip 对应的 python 版本。

E:\soft\python\python39\install>pip -V
pip 20.2.4 from e:\soft\python\python39\install\lib\site-packages\pip (python 3.9)

第二步: 安装 virtualenv

pip install virtualenv

第三步: 创建虚拟环境。
virtualenv 指令用于创建虚拟环境,后跟虚拟环境保存路径。

virtualenv E:\soft\python\python39\env

如果需要删除虚拟环境,直接删除对应文件夹即可。

第四步: pycharm 中选择已存在的虚拟环境。
"File --> Settings --> Python Interpreter",进入对应界面。

关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题

这里,需要选择到虚拟环境中的 python.exe,否则 OK 键为灰色,无法点击。

通过该方法,可以在原本报错的 pycharm 中创建 python3.9 虚拟环境。

2.2.2、pycharm 版本更换

报错版本为:pycharm-community-2019.2.1
下载安装最新版本:pycharm-community-2020.2.3

点击运行要安装的 pycharm-community-2020.2.3.exe 文件,会自动检测,提示卸载已安装的pycharm

为避免其他问题,卸载过程中,可以选择删除旧版本配置等。

关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题

经过测试,使用最新版本 pycharm 可以成功创建 python3.9 虚拟环境。
为了验证是否为 pycharm 的版本兼容问题,我卸载最新版本,重新安装旧版本 pycharm 后,依然报错!我猜测是固定的 pycharm 版本,使用了固定的某些 setuptools 版本,导致了兼容性报错。

我也怀疑过是系统中多个版本 python 的环境变量顺序,导致pycharm 找到了错误的依赖项。尝试在环境变量中将 python3.9 相关值移动到最前面,依然不能解决问题。

看来,最新的 python 还是得配最新的 pycharm!编码界的爱情故事么…

三、原因分析

感兴趣的朋友,欢迎继续阅读。

Traceback 报错日志中,可以看到,是在 setuptools-40.8.0\setuptools\py33compat.py 的55行, 执行 unescape = getattr(html, 'unescape', html_parser.HTMLParser().unescape) 时,抛出了 AttributeError: 'HTMLParser' object has no attribute 'unescape' 异常。

可以肯定是由 setuptools 引起的报错。这里有一个关键的信息:py33compat.py 文件。
pyXXcompat.pysetuptools 兼容 python 版本相关的文件。

进入到 ..\Lib\site-packages\setuptools 查看 setuptools-40.8.0 的安装文件,可以看到,包含了 py27compat.pypy31compat.pypy33compat.py

关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题

进入到 ..\Lib\site-packages\setuptools 查看 setuptools-49.2.1 的安装文件,可以看到,只包含了 py34compat.py

关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题

而我们从 python3.9changelog 中,可以知道 HTMLParser.unescape 属性被移除了,并且从 python3.4 开始就被弃用了。

所以,从兼容 python3.4 开始,setuptools 中就放弃了使用 HTMLParser.unescape
因此,只要包含 py34compat.py 文件的 setuptools 版本,就能兼容 python3.9 版本。

到此这篇关于关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题的文章就介绍到这了,更多相关pycharm 切换 python3.9 报错内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
Jun 29 Python
基于python3 OpenCV3实现静态图片人脸识别
May 25 Python
详解Python中的分组函数groupby和itertools)
Jul 11 Python
django框架model orM使用字典作为参数,保存数据的方法分析
Jun 24 Python
TensorFlow 显存使用机制详解
Feb 03 Python
解决python DataFrame 打印结果不换行问题
Apr 09 Python
使用Python防止SQL注入攻击的实现示例
May 21 Python
Django REST Swagger实现指定api参数
Jul 07 Python
scrapy结合selenium解析动态页面的实现
Sep 28 Python
celery在python爬虫中定时操作实例讲解
Nov 27 Python
python实现猜拳游戏项目
Nov 30 Python
Python使用pyenv实现多环境管理
Feb 05 Python
python中使用.py配置文件的方法详解
Nov 23 #Python
python爬虫使用scrapy注意事项
Nov 23 #Python
python爬虫筛选工作实例讲解
Nov 23 #Python
python爬虫用scrapy获取影片的实例分析
Nov 23 #Python
python爬虫scrapy图书分类实例讲解
Nov 23 #Python
scrapy处理python爬虫调度详解
Nov 23 #Python
利用Python将多张图片合成视频的实现
Nov 23 #Python
You might like
PHP程序61条面向对象分析设计的经验小结
2008/11/12 PHP
php设计模式之简单工厂模式详解
2014/09/04 PHP
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
2016/08/23 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
2018/01/21 Javascript
Angularjs中的$apply及优化使用详解
2018/07/02 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
Javascript执行流程细节原理解析
2020/05/14 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
Python命名空间详解
2014/08/18 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
python @property的用法及含义全面解析
2018/02/01 Python
tensorflow识别自己手写数字
2018/03/14 Python
flask框架中勾子函数的使用详解
2018/08/01 Python
Python延时操作实现方法示例
2018/08/14 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
英国领先的新鲜松露和最好的松露产品供应商:TruffleHunter
2019/08/26 全球购物
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
新娘父亲婚礼致辞
2014/01/16 职场文书
六个一活动实施方案
2014/03/21 职场文书
创先争优活动心得体会
2014/09/04 职场文书
骨干教师个人总结
2015/02/11 职场文书
值班管理制度范本
2015/08/06 职场文书
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle
Python学习之异常中的finally使用详解
2022/03/16 Python
Elasticsearch 配置详解
2022/04/19 Java/Android