1. 程式人生 > >[Python2] Win7(x64)下安裝Py2.7、pip,以及錯誤UnicodeEncodeError的解決方案

[Python2] Win7(x64)下安裝Py2.7、pip,以及錯誤UnicodeEncodeError的解決方案

環境

Win7 (x64) 中文

安裝Python以及Pip

  • 安裝setuptools

  • 安裝pip

    安裝完成後easy_install、pip均在目錄 C:\Python27\Scripts(記得將該目錄新增到系統環境變數中)

使用Pip安裝擴充套件庫

比如安裝requests庫:pip install requests

報錯如下:

…省略…
File “C:\Python27\lib\site-packages\pip-9.0.1-py2.7.egg\pip_vendor\colorama\ansitowin32.py”, line 174, in write_plain_text
self.wrapped.write(text[start:end])
UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\u258b’ in position 8: ordinal not in range(128)

解決方案:

找到檔案ansitowin32.py,並在檔案開頭加上

import sys
reload(sys)
sys.setdefaultencoding(‘gbk’) #gbk編碼在cmd下使用pip install進度條正常顯示,此處需根據自己需求更改該編碼

此處特地標紅了reload(sys)語句,如果不加這條語句,會出現錯誤:

AttributeError: ‘module’ object has no attribute ‘setdefaultencoding’

先看Python2.7模組載入過程:

 C:\Documents and Settings\Administrator
\桌面>python -v # installing zipimport hook import zipimport # builtin # installed zipimport hook # C:\Python27\lib\site.pyc matches C:\Python27\lib\site.py import site # precompiled from C:\Python27\lib\site.pyc # C:\Python27\lib\os.pyc matches C:\Python27\lib\os.py import os # precompiled from C:\Python
27\lib\os.pyc import errno # builtin import nt # builtin # C:\Python27\lib\ntpath.pyc matches C:\Python27\lib\ntpath.py import ntpath # precompiled from C:\Python27\lib\ntpath.pyc # C:\Python27\lib\stat.pyc matches C:\Python27\lib\stat.py import stat # precompiled from C:\Python27\lib\stat.pyc # C:\Python27\lib\genericpath.pyc matches C:\Python27\lib\genericpath.py import genericpath # precompiled from C:\Python27\lib\genericpath.pyc # C:\Python27\lib\warnings.pyc matches C:\Python27\lib\warnings.py import warnings # precompiled from C:\Python27\lib\warnings.pyc

首先會載入C:\Python2.7\lib\site.py檔案,在site.py檔案中的main函式最後兩句程式碼:

 def main():
    global ENABLE_USER_SITE
    abs__file__()
    known_paths = removeduppaths()
    if (os.name == "posix" and sys.path and
        os.path.basename(sys.path[-1]) == "Modules"):
        addbuilddir()
    if ENABLE_USER_SITE is None:
        ENABLE_USER_SITE = check_enableusersite()
    known_paths = addusersitepackages(known_paths)
    known_paths = addsitepackages(known_paths)
    if sys.platform == 'os2emx':
        setBEGINLIBPATH()
    setquit()
    setcopyright()
    sethelper()
    aliasmbcs()
    setencoding()
    execsitecustomize()
    if ENABLE_USER_SITE:
        execusercustomize()
    # Remove sys.setdefaultencoding() so that users cannot change the encoding after initialization. The test for presence is needed when this module is run as a script, because this code is executed twice.
     if hasattr(sys, "setdefaultencoding"):
        del sys.setdefaultencoding

在載入sys後,setdefaultencoding函式被刪除了,所以需要重新載入sys。

一勞永逸的方案

在python的Lib\site-packages資料夾下新建一個sitecustomize.py,內容為:

import sys
reload(sys)
sys.setdefaultencoding(‘gbk’)

python啟動的時候會呼叫sitecustomize.py檔案設定系統的預設編碼,而不需要每次都手動的在錯誤檔案上加這三行程式碼。

Reference