关于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中open()函数指定文件打开方式的用法
Jun 04 Python
python运行其他程序的实现方法
Jul 14 Python
python 类对象和实例对象动态添加方法(分享)
Dec 31 Python
Python中的random.uniform()函数教程与实例解析
Mar 02 Python
详解用python自制微信机器人,定时发送天气预报
Mar 25 Python
Django重置migrations文件的方法步骤
May 01 Python
numpy和pandas中数组的合并、拉直和重塑实例
Jun 28 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
Aug 12 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
Sep 25 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
python 实现控制鼠标键盘
Nov 27 Python
Django haystack实现全文搜索代码示例
Nov 28 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不写闭合标签的好处
2014/03/04 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
非常漂亮的JS代码经典广告
2007/10/21 Javascript
获取焦点时,利用js定时器设定时间执行动作
2010/04/02 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
jQuery中$.each()函数的用法引申实例
2016/05/12 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
2017/06/16 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
windows下python连接oracle数据库
2017/06/07 Python
详解Python里使用正则表达式的ASCII模式
2017/11/02 Python
python MySQLdb使用教程详解
2018/03/20 Python
华为校园招聘上机笔试题 扑克牌大小(python)
2020/04/22 Python
通过python检测字符串的字母
2020/02/18 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
详细分析Python垃圾回收机制
2020/07/01 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
css3的@media属性实现页面响应式布局示例代码
2014/02/10 HTML / CSS
干部行政关系介绍信
2014/01/17 职场文书
大学活动邀请函
2014/01/28 职场文书
优秀毕业生自我鉴定
2014/02/11 职场文书
单位委托书怎么写
2014/08/02 职场文书
大专毕业生自我鉴定范文(2篇)
2014/09/27 职场文书
2015年个人审计工作总结
2015/04/07 职场文书
作弊检讨书范文
2015/05/06 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js
《乙女游戏世界对路人角色很不友好》OP主题曲无字幕动画MV公开
2022/04/05 日漫
Selenium浏览器自动化如何上传文件
2022/04/06 Python