今天在公司里安裝flask的時候,一切正常,可以正常import flask
但是回到家里,卻莫名其妙的報錯了。
Exception: Traceback (most recent call last): File "c:\users\ruby\appdata\local\programs\python\python36\lib\site-packages\pip\compat\__init__.py", line 73, in console_to_str return s.decode(sys.__stdout__.encoding) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 33: invalid start byte During handling of the above exception, another exception occurred: Traceback (most recent call last): File "c:\users\ruby\appdata\local\programs\python\python36\lib\site-packages\pip\basecommand.py", line 216, in main status = self.run(options, args) File "c:\users\ruby\appdata\local\programs\python\python36\lib\site-packages\pip\commands\install.py", line 342, in run prefix=options.prefix_path, File "c:\users\ruby\appdata\local\programs\python\python36\lib\site-packages\pip\req\req_set.py", line 784, in install **kwargs File "c:\users\ruby\appdata\local\programs\python\python36\lib\site-packages\pip\req\req_install.py", line 878, in install spinner=spinner, File "c:\users\ruby\appdata\local\programs\python\python36\lib\site-packages\pip\utils\__init__.py", line 676, in call_subprocess line = console_to_str(proc.stdout.readline()) File "c:\users\ruby\appdata\local\programs\python\python36\lib\site-packages\pip\compat\__init__.py", line 75, in console_to_str return s.decode('utf_8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 33: invalid start byte
報錯大概是這樣的,總之我開始是沒怎么看報錯信息,然后去百度查了一大堆。結果發現除了有一位csdn的博主:nankaizhl的報錯可能和我差不多,其他就沒怎么找到,包括stackoverflow。
也不知道今天是吃錯葯了還是咋的,我竟然沒有立即放棄,按照nankaizhl的一些說明,改了以后發現沒有用,直接報錯了。
python3里面好像都沒有reload這個函數了。
難道我就只能在公司電腦里學python?
我只能硬着頭皮去啃報錯的traceback了。
我們仔細看下。
python先是在解決某個異常后,又發現了一個異常。有意思的是,另外一個異常,往回追溯,回到了同一個文件。
File "c:\users\ruby\appdata\local\programs\python\python36\lib\site-packages\pip\compat\__init__.py"
沒辦法,只能帶着恐懼來看python安裝包里的py代碼了。
但python解釋器很有好的給出了報錯行數。
我把相關行截出來。
if sys.version_info >= (3,): def console_to_str(s): try: return s.decode(sys.__stdout__.encoding) # except UnicodeDecodeError: return s.decode('utf-8') #
報錯的2個#的那一行。
這個語法是一個異常處理的,難怪會報錯來自同一個文件,這里很簡單的說明了如果不能正常編碼的話,就用utf-8編碼。
然后看traceback里的信息,表明,即使用utf-8編碼也不行,對於中國電腦來收,一般就是路徑里面有中文。
雖說我們也可以找一下哪些路徑有中文,但我沒這個水平。
很自然的一個修改的是,把這個改成下面這樣,用gbk的中文編碼。
if sys.version_info >= (3,): def console_to_str(s): try: return s.decode(sys.__stdout__.encoding) except UnicodeDecodeError: return s.decode('gbk') #
未免改后有問題,我在后面加了一個#。
結果正常了。
補充一點還可能出問題的是,pip安裝flask報錯后,你再次pip install flask,會返回你安裝成功的信息。
好像也不是安裝成功,更准確的說法是沒有報錯,但這時你import flask會報錯,如下:
我這里的報錯顯示的很清晰,沒有markupsafe._compat這個module。
所以我本來是想先pip uninstall flask,但是很遺憾,這樣並不能把MarkupSafe卸載掉。
你需要pip uninstall MarkupSafe才行,然后把上面的編碼改成gbk后,再pip install flask。
這樣就沒問題了,然后我們就一起去學習flask吧。