關于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' >>>
目前最新版本,應該是到
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
為應用提供隔離的 Python
運行環(huán)境,可以解決不同應用間多版本 python
的沖突問題。
利用 virtualenv
創(chuàng)建虛擬環(huán)境后,pycharm
中創(chuàng)建虛擬環(huán)境時,選擇已存在的虛擬環(huán)境,可以避開報錯。
第一步: 確認 python3.9
對應的 pip
工具。
如果沒有配環(huán)境變量,可以直接從安裝路徑下打開 cmd
工具。一般在 python
安裝目錄下的 Scripts
文件夾內(nèi)。使用 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
第三步: 創(chuàng)建虛擬環(huán)境。
virtualenv
指令用于創(chuàng)建虛擬環(huán)境,后跟虛擬環(huán)境保存路徑。
virtualenv E:\soft\python\python39\env
如果需要刪除虛擬環(huán)境,直接刪除對應文件夾即可。
第四步: pycharm
中選擇已存在的虛擬環(huán)境。
"File
--> Settings
--> Python Interpreter
",進入對應界面。
這里,需要選擇到虛擬環(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
相關值移動到最前面,依然不能解決問題。
看來,最新的
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
引起的報錯。這里有一個關鍵的信息: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 報錯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python的Django框架中使用SQLAlchemy操作數(shù)據(jù)庫的教程
SQLAlchemy是Python一個專門的數(shù)據(jù)庫管理工具,如果對Django ORM覺得有些生疏的話完全可以結合SQLAlchemy,這里我們就來總結一下Python的Django框架中使用SQLAlchemy操作數(shù)據(jù)庫的教程2016-06-06python3 使用openpyxl將mysql數(shù)據(jù)寫入xlsx的操作
這篇文章主要介紹了python3 使用openpyxl將mysql數(shù)據(jù)寫入xlsx的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05解析Mac OS下部署Pyhton的Django框架項目的過程
這篇文章主要介紹了Mac OS下部署Pyhton的Django框架項目的過程,還附帶將了一個gunicorn結合Nginx來部署Django應用的方法,需要的朋友可以參考下2016-05-05