關(guān)于pycharm 切換 python3.9 報錯 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的問題
有的bug,莫名其妙就好了…
python3.9 報錯 “AttributeError: 'HTMLParser' object has no attribute 'unescape'” 異常分析解決。
一、問題描述
安裝 python3.9 版本后,pycharm 中切換 python3.9 版本,創(chuàng)建虛擬環(huán)境報錯:"AttributeError: 'HTMLParser' object has no attribute 'unescape'"。
Executed command:
C:\Users\腳本之家\AppData\Local\Temp\tmp41_yhcxspycharm-management\setuptools-40.8.0\setup.py installError 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'
查看官網(wǎng) python3.9 的 changelog,發(fā)現(xiàn) HTMLParser.unescape 屬性被移除了,并且從 python3.4 開始就被棄用。

pycharm 創(chuàng)建虛擬環(huán)境時,會使用到 setuptools。而 setuptools 中,剛好使用了這個屬性,所以,導致了"AttributeError: 'HTMLParser' object has no attribute 'unescape'"異常。
經(jīng)過各種分析、嘗試,問題最終得到解決。記錄下過程,避免更多人踩坑。
二、解決方法
先給出解決方法,感興趣的朋友,可以繼續(xù)閱讀后面的分析部分。
解決這個問題,分兩種情況:
1. 不通過 pycharm 編輯器,直接使用 python 解釋器。
2. 在 pycharm 編輯器中使用 python 解釋器。
我是在
pycharm中使用python3.9觸發(fā)報錯,所以這里也單獨提出來討論討論。
2.1、直接使用 python 解釋器
不通過 pycharm 編輯器,直接使用 python 解釋器。比如,在 windows 的 cmd ,或 linux 下的命令行中使用 python。
解決方法:更新 setuptools 版本。
我以 python3.9 使用 setuptools 為例,測試如下。
2.1.1、setuptools 低版本觸發(fā)報錯
以 setuptools-40.8.0 為例,測試觸發(fā)報錯如下:
第一步,使用 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 中導入包觸發(fā)報錯:
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' >>>
目前最新版本,應(yīng)該是到
setuptools-50.3.2了 。
2.2、在 pycharm 中使用 python 解釋器
在 pycharm 中創(chuàng)建 python3.9 虛擬環(huán)境報錯,本質(zhì)上也是使用了 setuptools 的低版本導致。
我嘗試過更新 setuptools 為更高的版本,但 pycharm 還是頑固的使用了 setuptools-40.8.0,如最開始的報錯信息所示…
我不知道是 pycharm 中的某些默認配置導致,還是 pycharm 的版本屬性導致它使用了低版本的 setuptools,如果有朋友知道,歡迎告知。
雖然,不知道 pycharm 中選擇低版本 setuptools 的原因。這里,也簡單提供兩種解決方法吧~
2.2.1、virtualenv 創(chuàng)建虛擬環(huán)境
virtualenv 為應(yīng)用提供隔離的 Python 運行環(huán)境,可以解決不同應(yīng)用間多版本 python 的沖突問題。
利用 virtualenv 創(chuàng)建虛擬環(huán)境后,pycharm 中創(chuàng)建虛擬環(huán)境時,選擇已存在的虛擬環(huán)境,可以避開報錯。
第一步: 確認 python3.9 對應(yīng)的 pip 工具。
如果沒有配環(huán)境變量,可以直接從安裝路徑下打開 cmd 工具。一般在 python 安裝目錄下的 Scripts 文件夾內(nèi)。使用 pip -V 可以查看 pip 對應(yīng)的 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
第三步: 創(chuàng)建虛擬環(huán)境。
virtualenv 指令用于創(chuàng)建虛擬環(huán)境,后跟虛擬環(huán)境保存路徑。
virtualenv E:\soft\python\python39\env
如果需要刪除虛擬環(huán)境,直接刪除對應(yīng)文件夾即可。
第四步: pycharm 中選擇已存在的虛擬環(huán)境。
"File --> Settings --> Python Interpreter",進入對應(yīng)界面。

這里,需要選擇到虛擬環(huán)境中的
python.exe,否則OK鍵為灰色,無法點擊。
通過該方法,可以在原本報錯的 pycharm 中創(chuàng)建 python3.9 虛擬環(huán)境。
2.2.2、pycharm 版本更換
報錯版本為:pycharm-community-2019.2.1。
下載安裝最新版本:pycharm-community-2020.2.3。
點擊運行要安裝的 pycharm-community-2020.2.3.exe 文件,會自動檢測,提示卸載已安裝的pycharm。
為避免其他問題,卸載過程中,可以選擇刪除舊版本配置等。

經(jīng)過測試,使用最新版本 pycharm 可以成功創(chuàng)建 python3.9 虛擬環(huán)境。
為了驗證是否為 pycharm 的版本兼容問題,我卸載最新版本,重新安裝舊版本 pycharm 后,依然報錯!我猜測是固定的 pycharm 版本,使用了固定的某些 setuptools 版本,導致了兼容性報錯。
我也懷疑過是系統(tǒng)中多個版本 python 的環(huán)境變量順序,導致pycharm 找到了錯誤的依賴項。嘗試在環(huán)境變量中將 python3.9 相關(guān)值移動到最前面,依然不能解決問題。
看來,最新的
python還是得配最新的pycharm!編碼界的愛情故事么…
三、原因分析
感興趣的朋友,歡迎繼續(xù)閱讀。
從 Traceback 報錯日志中,可以看到,是在 setuptools-40.8.0\setuptools\py33compat.py 的55行, 執(zhí)行 unescape = getattr(html, 'unescape', html_parser.HTMLParser().unescape) 時,拋出了 AttributeError: 'HTMLParser' object has no attribute 'unescape' 異常。
可以肯定是由 setuptools 引起的報錯。這里有一個關(guān)鍵的信息:py33compat.py 文件。
pyXXcompat.py 是 setuptools 兼容 python 版本相關(guān)的文件。
進入到 ..\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 版本。
到此這篇關(guān)于關(guān)于pycharm 切換 python3.9 報錯 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的問題的文章就介紹到這了,更多相關(guān)pycharm 切換 python3.9 報錯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python的Django框架中使用SQLAlchemy操作數(shù)據(jù)庫的教程
SQLAlchemy是Python一個專門的數(shù)據(jù)庫管理工具,如果對Django ORM覺得有些生疏的話完全可以結(jié)合SQLAlchemy,這里我們就來總結(jié)一下Python的Django框架中使用SQLAlchemy操作數(shù)據(jù)庫的教程2016-06-06
python3 使用openpyxl將mysql數(shù)據(jù)寫入xlsx的操作
這篇文章主要介紹了python3 使用openpyxl將mysql數(shù)據(jù)寫入xlsx的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
解析Mac OS下部署Pyhton的Django框架項目的過程
這篇文章主要介紹了Mac OS下部署Pyhton的Django框架項目的過程,還附帶將了一個gunicorn結(jié)合Nginx來部署Django應(yīng)用的方法,需要的朋友可以參考下2016-05-05

