有的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

import setuptools

File "C:\Users\我们\AppData\Local\Temp\tmp0mv4mj35pycharm-management\setuptools-40.8.0\setuptools\__init__.py", line 20, in

from setuptools.dist import Distribution, Feature

File "C:\Users\我们\AppData\Local\Temp\tmp0mv4mj35pycharm-management\setuptools-40.8.0\setuptools\dist.py", line 35, in

from setuptools.depends import Require

File "C:\Users\我们\AppData\Local\Temp\tmp0mv4mj35pycharm-management\setuptools-40.8.0\setuptools\depends.py", line 7, in

from .py33compat import Bytecode

File "C:\Users\我们\AppData\Local\Temp\tmp0mv4mj35pycharm-management\setuptools-40.8.0\setuptools\py33compat.py", line 55, in

unescape = getattr(html, 'unescape', html_parser.HTMLParser().unescape)

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

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

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

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

二、解决方法

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

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

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

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

2.1、直接使用 python 解释器

不通过 pycharm 编辑器,直接使用 python 解释器。比如,在 windows 的 cmd ,或 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 "", line 1, in

File "E:\soft\python\python39\install\lib\site-packages\setuptools\__init__.py", line 20, in

from setuptools.dist import Distribution, Feature

File "E:\soft\python\python39\install\lib\site-packages\setuptools\dist.py", line 35, in

from setuptools.depends import Require

File "E:\soft\python\python39\install\lib\site-packages\setuptools\depends.py", line 7, in

from .py33compat import Bytecode

File "E:\soft\python\python39\install\lib\site-packages\setuptools\py33compat.py", line 55, in

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",进入对应界面。

这里,需要选择到虚拟环境中的 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 虚拟环境。

为了验证是否为 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.py 是 setuptools 兼容 python 版本相关的文件。

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

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

而我们从 python3.9 的 changelog 中,可以知道 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 报错内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

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

本文地址: http://www.cppcns.com/jiaoben/python/366056.html

python操作html的object_关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题...相关推荐

  1. 解决 Pycharm 使用高版本 python(3.9)报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 之修改pycharm

    由于Python出现3.10版本,此方法修改后仍会导致python版本识别错误,所以不再推荐此方法. 感谢 本篇博文参考了以下内容: 程序员的一天--pycharm 切换 python3.9 报错 ' ...

  2. python docx设置标题中文字体rPr.rFonts.set(qn(‘w:eastAsia‘),u‘黑体‘),报错‘NoneType‘ object has no attribute ‘set‘

    一.我的代码: 因为要编一个报告自动化生成的代码,所以用了python docx,在设置标题自己写了一段代码,要求将标题设置成:一级标题 黑体 小四 from docx import Document ...

  3. 安装python包时报‘HTMLParser‘ object has no attribute ‘unescape‘

    原因: 老版本的setuptools 解决办法 pip3 uninstall setuptools pip3 install setuptools 之后再安装python包

  4. PyCharm使用期间出现报错集合 持续更新ing

    PyCharm使用期间出现报错集合 持续更新ing 啥时候用PyCharm发现了奇奇怪怪的错误就整理上来 这几天帮同学安装torch的时候出现了一些奇奇怪怪的问题 1.torch始终安装失败 描述一下 ...

  5. Git 无法切换分支,报错git did not exit cleanly

    Git 无法切换分支,报错git did not exit cleanly 今天从做内存泄漏测试需要切换Git分支,checkout 的时候发现报错git did not exit cleanly. ...

  6. 关于pycharm中运行代码报错的解决思路

    关于pycharm中运行代码报错的解决思路 复盘一下对于代码运行报错的解决思路,以免忘了. 之前对于代码报错有种恐惧感,生怕出什么幺蛾子,但每次都会有很多bug,每改进一个bug又会出现下一个bug, ...

  7. pycharm成功但是cmd报错找不到moudle

    (pycharm成功但是cmd报错找不到moudle) python编译一个代码的时候 pycharm已经成功,但是terminal总是报错ModuleNotFoundError:No moudle ...

  8. python报错'str' object is not callable

    >>> x=1.235 >>> int(x) 1 >>> str="fsgavfdbafdbntsbgbt" >> ...

  9. python如何避免转义字符_如何解决因转义字符而报错的问题(在使用python导入文件时)...

    有些萌新在初次使用python导入文件时,可能会遇到遇到各种各样的报错.今天我们就来讲讲其中最常见的一种报错---转义字符"\"冲突. 问题重述: 比如像下面这样,当我们想导入一个 ...

最新文章

  1. JavaScript中的load事件的作用_史上最全的web前端面试题汇总及答案JavaScript之二(二)...
  2. UVa 1632 阿里巴巴(区间DP)
  3. mysql查询更新时的锁表机制分析
  4. SourceTree 免登录跳过初始设置
  5. java geom_java.awt.geom 类 Area - Java 中文参考手册
  6. Qt DLL总结-创建及调用QT的 DLL
  7. pass样本量_年度质量回顾-样本量
  8. mongodb,spring data api常用总结
  9. 【Matlab学习笔记】【数学形态学】分水岭分割算法
  10. 基于Idea+Java+MySQL+SSM的毕业设计网上管理系统(建议收藏)
  11. 数据结构-01-图解后缀表达式值计算方式
  12. 虚拟软驱_文伟_新浪博客
  13. 自适应求积算法 MatLab版
  14. 有些软件,听着听着就没了...
  15. 【应用随机过程】06. 布朗运动
  16. 遥感基础——红外波段分类
  17. android x86_646,雷电模拟器4.0x86_64位版本即android 7.1 xposed安装
  18. 867 · 四键键盘
  19. 计算机发展史资料简介,计算机发展史简介
  20. linux安装Node.js 详细安装教程

热门文章

  1. 360等中概股遭遇找壳难 回归A股不容易
  2. Daemontools简介
  3. 快来跟我一起学 React(Day8)
  4. iOS开发之第三方分享微信分享、朋友圈分享,史上最新最全第三方分享微信方式实现、朋友圈方式实现
  5. EMQX ACL 授权
  6. 2022中国移动源环境管理年报(附下载)
  7. 智慧社区搭载联网智能门锁,出行体验不一般!
  8. 工厂用计算机自动控制技术,一种基于计算机技术的工厂车间灯光控制系统的制作方法...
  9. Leetcode岛屿问题系列分析
  10. 毕业论文管理系统的设计与实现