1. 程式人生 > >Windows 7下用 pip 安裝 markupsafe 時遇到的錯誤

Windows 7下用 pip 安裝 markupsafe 時遇到的錯誤

前幾天寫 Python 爬蟲,在 Windows 7 上用 pip 安裝了很多Python 庫。但是安裝 jinja2 時遇到了問題。第一次安裝 jinja2 失敗,第二次顯示成功。但是我到Python IDLE 裡 import jinja2 時卻出現下面的錯誤:

>>> import jinja2
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    import jinja2
  File "C:\Python361\lib\site-packages\jinja2\__init__.py"
, line 33, in <module> from jinja2.environment import Environment, Template File "C:\Python361\lib\site-packages\jinja2\environment.py", line 15, in <module> from jinja2 import nodes File "C:\Python361\lib\site-packages\jinja2\nodes.py", line 19, in <module> from jinja2.utils import
Markup File "C:\Python361\lib\site-packages\jinja2\utils.py", line 624, in <module> from markupsafe import Markup, escape, soft_unicode File "C:\Python361\lib\site-packages\markupsafe\__init__.py", line 14, in <module> from markupsafe._compat import text_type, string_types, int_types, \ ModuleNotFoundError
: No module named 'markupsafe._compat'

看起來是 jinja2 依賴的庫 markupsafe 沒安裝成功。我又反覆解除安裝重灌了 markupsafe,都是第一次安裝錯誤,第二次安裝假成功,實際上都沒安裝好。沒安裝失敗的報錯如下:

C:\Windows\System32>pip install markupsafe
Collecting markupsafe
  Downloading http://pypi.doubanio.com/packages/4d/de/32d741db316d8fdb7680822dd3
7001ef7a448255de9699ab4bfcbdf4172b/MarkupSafe-1.0.tar.gz
Installing collected packages: markupsafe
  Running setup.py install for markupsafe ... error
Exception:
Traceback (most recent call last):
  File "c:\python361\lib\site-packages\pip\compat\__init__.py", line 73, in cons
ole_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:\python361\lib\site-packages\pip\basecommand.py", line 215, in main
    status = self.run(options, args)
  File "c:\python361\lib\site-packages\pip\commands\install.py", line 342, in ru
n
    prefix=options.prefix_path,
  File "c:\python361\lib\site-packages\pip\req\req_set.py", line 784, in install

    **kwargs
  File "c:\python361\lib\site-packages\pip\req\req_install.py", line 878, in ins
tall
    spinner=spinner,
  File "c:\python361\lib\site-packages\pip\utils\__init__.py", line 676, in call
_subprocess
    line = console_to_str(proc.stdout.readline())
  File "c:\python361\lib\site-packages\pip\compat\__init__.py", line 75, in cons
ole_to_str
    return s.decode('utf_8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 33: invalid
 start byte

網上搜索了一下很多沒成功。但問題確定在 markupsafe 身上。將 markupsafe 的 whl 檔案下載到本地直接安裝也不行。後來我只能放棄使用 jinja2,轉而使用 Mako。

今天我重新解除安裝、安裝 markupsafe,還是老問題。再次搜尋了一下,發現這裡有人說是編碼的問題。

開啟c:\program files\python36\lib\site-packages\pip\compat\__init__.py約75行
return s.decode('utf_8') 改為return s.decode('cp936')

編碼問題,雖然py3統一用utf-8了。但win下的終端顯示用的還是gbk編碼

可我不想修改 pip 的安裝指令碼,感覺太危險。既然是 Windows cmd 的編碼問題,那我換個終端試試。於是用 Git Bash 終端重新安裝 markupsafe,一次就成功了。
用Git Bash 安裝 markupsafe
在 IDLE 裡也能成功匯入 jinja2 了。

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import jinja2
>>> 

解決方法

用 Git Base 執行 pip 安裝 markupsafe。

未決的疑問

為什麼終端的字元編碼會影響 pip 安裝 Python 庫呢?