2016-03-01 39 views
1

當試圖在我的Windows 10的機器上安裝mysql-python的我得到以下錯誤:Pip安裝會在Windows上引發UnicodeDecodeError。固定?

File "<string>", line 1, in <module> 
    File "C:\Users\LUCAFL~1\AppData\Local\Temp\pip-build-3u7aih0l\mysql-python\setup.py", line 21, in <module> 
    setuptools.setup(**metadata) 
    File "c:\program files (x86)\python35-32\lib\distutils\core.py", line 148, in setup 
    dist.run_commands() 
    ... 
    File "c:\program files (x86)\python35-32\lib\subprocess.py", line 1055, in communicate 
    stdout = self.stdout.read() 
    File "c:\program files (x86)\python35-32\lib\encodings\cp1252.py", line 23, in decode 
    return codecs.charmap_decode(input,self.errors,decoding_table)[0] 
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 1716: character maps to <undefined> 

我嘗試安裝其他包並收到了幾乎每一個(一個例外是pymysql)同樣的錯誤。所有這些軟件包都很大,並且有依賴關係。我想那些大的在我的用戶目錄APPDATA文件夾中創建臨時數據。如您所見,ü未正確解碼(ü爲字節0x81)。總是會產生錯誤的德語元音變音(主要是因爲它是我的用戶文件夾名稱的一部分)。

我搜索了過去2個小時,發現很多人遇到了同樣的問題,但大多數人都是打開github票據或討論Ubuntu/Fedora/OSX等問題。我讀了幾次, windows下的標準編碼是cp-1252導致了這個問題。我能以某種方式強制使用我的控制檯的窗口使用utf-8進行此會話,然後用它運行pip嗎?

請不要推薦我重命名我的用戶文件夾。這在Windows 10下並不容易,我不想僅僅因爲python就重新安裝windows。

我的設置:視窗10,Python的3.5.1,8.0.3 PIP

+1

'distutils._msvccompiler._get_vc_env'使用子進程模塊調用'vcvarsall.bat'和'set'來獲取環境。當'stdout'是一個管道時,'set'默認使用當前控制檯代碼頁,在你的情況下是OEM代碼頁,850.但是,對於'universal_newlines = True',子進程使用' ANSI代碼頁,在你的情況下是1252.作爲快速修復,首先運行'chcp.com 1252'來更改控制檯代碼頁。 – eryksun

+0

這裏distutils的最佳選擇是直接調用'subprocess.Popen'來運行'cmd.exe/U/c',這使得內置'set'命令輸出UTF-16LE文本。然後從'stdout = io.TextIOWrapper(proc.stdout,encoding ='utf-16le')'讀取輸出。通過這種方式,您可以獲得確切的Unicode環境,而不必通過ANSI或OEM代碼頁轉換對其進行修改。 – eryksun

+0

這似乎解決了解碼問題。我仍然有點困惑,爲什麼改變代碼頁可以解決問題。我認爲這是一個UnicodeDecodeError? –

回答

1

你可以嘗試以下,看看它是否工作。用你的實際路徑替換Python的路徑。
我無法模擬我的windows筆記本電腦。

import sys 
import subprocess 

reload(sys) # Reload may do the trick! 
sys.setdefaultencoding('UTF8') 


theproc =subprocess.call(['C:\\Python27\\Scripts\\pip.exe', 'install', 'mysql-python']) 
theproc.communicate() 
+0

我搜索了一下,除了提出了另一個可能破壞依賴於標準ascii編碼的代碼的問題,sys.setdefaultencoding hack在python 3中被刪除。 –

+0

你可以在最後一行再次使用'reload(sys)'。這將在執行下一組代碼之前重新加載默認系統參數,因此希望能夠防止任何中斷。我們正在嘗試僅將它用於'pip install'部分。 – 2016-03-04 20:58:14

+0

代碼取決於ascii我的意思是整個安裝過程(無論發生在那裏)。這種方法仍然不適用於python3.x,即使調用imp.reload,sys.setdefaultencoding也會保持刪除狀態。 –