关于pycharm切换
⽬录
⼀、问题描述
⼆、解决⽅法
三、原因分析
有的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.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 "<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_
e:\soft\python\python39\install\scripts\
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的低版本导致。
python安装教程非常详细我尝试过更新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",进⼊对应界⾯。
这⾥,需要选择到虚拟环境中的,否则OK键为灰⾊,⽆法点击。
通过该⽅法,可以在原本报错的pycharm中创建python3.9虚拟环境。
2.2.2、pycharm版本更换
报错版本为:pycharm-community-2019.2.1。
下载安装最新版本:pycharm-community-2020.2.3。
点击运⾏要安装的pycharm-community-2020.⽂件,会⾃动检测,提⽰卸载已安装的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 报错内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。