2016-03-01 37 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也会保持删除状态。 –