当试图在我的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
'distutils._msvccompiler._get_vc_env'使用子进程模块调用'vcvarsall.bat'和'set'来获取环境。当'stdout'是一个管道时,'set'默认使用当前控制台代码页,在你的情况下是OEM代码页,850.但是,对于'universal_newlines = True',子进程使用' ANSI代码页,在你的情况下是1252.作为快速修复,首先运行'chcp.com 1252'来更改控制台代码页。 – eryksun
这里distutils的最佳选择是直接调用'subprocess.Popen'来运行'cmd.exe/U/c',这使得内置'set'命令输出UTF-16LE文本。然后从'stdout = io.TextIOWrapper(proc.stdout,encoding ='utf-16le')'读取输出。通过这种方式,您可以获得确切的Unicode环境,而不必通过ANSI或OEM代码页转换对其进行修改。 – eryksun
这似乎解决了解码问题。我仍然有点困惑,为什么改变代码页可以解决问题。我认为这是一个UnicodeDecodeError? –