Python - 另一个编码问题。Windows 8.1,最新Python版本,pip抛出异常
我在我的Windows 8.1电脑上安装了一个全新的Python版本。 我试过Python 2.7.8和Python 3.4。
我在命令提示符下运行了python get-pip.py,这样就正确安装了pip。我是从这里下载的。
之后我运行了pip install mongo-connector。这会下载mongo连接器,但出现了一个错误,内容如下:
Downloading/unpacking mongo-connector
Downloading mongo-connector-1.3.tar.gz
Running setup.py (path:c:\users\imon~1\appdata\local\temp\pip_build_èimon\mong
o-connector\setup.py) egg_info for package mongo-connector
Cleaning up...
Exception:
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\pip\basecommand.py", line 122, in main
status = self.run(options, args)
File "C:\Python27\lib\site-packages\pip\commands\install.py", line 278, in run
requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundl
e=self.bundle)
File "C:\Python27\lib\site-packages\pip\req.py", line 1234, in prepare_files
req_to_install.assert_source_matches_version()
File "C:\Python27\lib\site-packages\pip\req.py", line 464, in assert_source_ma
tches_version
% (display_path(self.source_dir), version, self))
UnicodeDecodeError: 'ascii' codec can't decode byte 0x8a in position 55: ordinal
not in range(128)
Traceback (most recent call last):
File "C:\Python27\lib\runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "C:\Python27\lib\runpy.py", line 72, in _run_code
exec code in run_globals
File "C:\Python27\Scripts\pip.exe\__main__.py", line 9, in <module>
File "C:\Python27\lib\site-packages\pip\__init__.py", line 185, in main
return command.main(cmd_args)
File "C:\Python27\lib\site-packages\pip\basecommand.py", line 161, in main
text = '\n'.join(complete_log)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x8a in position 70: ordinal
not in range(128)
在Python 3.4的情况下,它出现了:
Downloading/unpacking mongo-connector
Downloading mongo-connector-1.3.tar.gz
Cleaning up...
Exception:
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\pip\basecommand.py", line 122, in main
status = self.run(options, args)
File "C:\Python34\lib\site-packages\pip\commands\install.py", line 278, in run
requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundl
e=self.bundle)
File "C:\Python34\lib\site-packages\pip\req.py", line 1229, in prepare_files
req_to_install.run_egg_info()
File "C:\Python34\lib\site-packages\pip\req.py", line 292, in run_egg_info
logger.notify('Running setup.py (path:%s) egg_info for package %s' % (self.s
etup_py, self.name))
File "C:\Python34\lib\site-packages\pip\log.py", line 102, in notify
self.log(self.NOTIFY, msg, *args, **kw)
File "C:\Python34\lib\site-packages\pip\log.py", line 162, in log
consumer.write(write_content)
File "C:\Python34\lib\site-packages\pip\_vendor\colorama\ansitowin32.py", line
116, in write
self.write_and_convert(text)
File "C:\Python34\lib\site-packages\pip\_vendor\colorama\ansitowin32.py", line
143, in write_and_convert
self.write_plain_text(text, cursor, len(text))
File "C:\Python34\lib\site-packages\pip\_vendor\colorama\ansitowin32.py", line
148, in write_plain_text
self.wrapped.write(text[start:end])
File "C:\Python34\lib\encodings\cp437.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u0160' in position
70: character maps to <undefined>
Traceback (most recent call last):
File "C:\Python34\lib\runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "C:\Python34\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Python34\Scripts\pip.exe\__main__.py", line 9, in <module>
File "C:\Python34\lib\site-packages\pip\__init__.py", line 185, in main
return command.main(cmd_args)
File "C:\Python34\lib\site-packages\pip\basecommand.py", line 168, in main
logger.fatal('Storing debug log for failure in %s' % log_file_fn)
File "C:\Python34\lib\site-packages\pip\log.py", line 111, in fatal
self.log(self.FATAL, msg, *args, **kw)
File "C:\Python34\lib\site-packages\pip\log.py", line 162, in log
consumer.write(write_content)
File "C:\Python34\lib\site-packages\pip\_vendor\colorama\ansitowin32.py", line
116, in write
self.write_and_convert(text)
File "C:\Python34\lib\site-packages\pip\_vendor\colorama\ansitowin32.py", line
140, in write_and_convert
self.write_plain_text(text, cursor, start)
File "C:\Python34\lib\site-packages\pip\_vendor\colorama\ansitowin32.py", line
148, in write_plain_text
self.wrapped.write(text[start:end])
File "C:\Python34\lib\encodings\cp437.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u0160' in position
42: character maps to <undefined>
====
如果我只运行pip而不加任何参数,就会出现这个错误:
Traceback (most recent call last):
File "C:\Python34\lib\runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "C:\Python34\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Python34\Scripts\pip.exe\__main__.py", line 9, in <module>
File "C:\Python34\lib\site-packages\pip\__init__.py", line 177, in main
cmd_name, cmd_args = parseopts(initial_args)
File "C:\Python34\lib\site-packages\pip\__init__.py", line 148, in parseopts
parser.print_help()
File "C:\Python34\lib\optparse.py", line 1646, in print_help
file.write(self.format_help())
File "C:\Python34\lib\encodings\cp437.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u0160' in position
1235: character maps to <undefined>
在Python 2.7.8中运行pip也会出现这个错误:
Traceback (most recent call last):
File "C:\Python27\lib\runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "C:\Python27\lib\runpy.py", line 72, in _run_code
exec code in run_globals
File "C:\Python27\Scripts\pip.exe\__main__.py", line 9, in <module>
File "C:\Python27\lib\site-packages\pip\__init__.py", line 177, in main
cmd_name, cmd_args = parseopts(initial_args)
File "C:\Python27\lib\site-packages\pip\__init__.py", line 148, in parseopts
parser.print_help()
File "C:\Python27\lib\optparse.py", line 1670, in print_help
file.write(self.format_help().encode(encoding, "replace"))
File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x8a in position 1210: ordin
al not in range(128)
在我用过的其他机器上从来没有遇到过这种情况。我找到很多类似的问题,但没有一个能解决我现在遇到的情况。
这个帖子告诉我运行chcp 65001。当我这样做后再运行pip,就出现了这个错误:
C:\Python27\Scripts>pip
Traceback (most recent call last):
File "C:\Python27\lib\runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "C:\Python27\lib\runpy.py", line 72, in _run_code
exec code in run_globals
File "C:\Python27\Scripts\pip.exe\__main__.py", line 9, in <module>
File "C:\Python27\lib\site-packages\pip\__init__.py", line 177, in main
cmd_name, cmd_args = parseopts(initial_args)
File "C:\Python27\lib\site-packages\pip\__init__.py", line 148, in parseopts
parser.print_help()
File "C:\Python27\lib\optparse.py", line 1670, in print_help
file.write(self.format_help().encode(encoding, "replace"))
LookupError: unknown encoding: cp65001
根据这个帖子,问题可能是因为我的用户名是“Šimon”,里面有一个Unicode字符。不过,我不知道该怎么处理这个问题。我不想去修改任何Python文件的编码,这样做似乎只是一个非常复杂且临时的解决办法。(Windows自动生成了我的用户名——这又是一个糟糕的主意,让我无法自己选择用户名。)
3 个回答
这是一个关于pip的错误,经过两年仍然没有得到妥善解决。你可以查看这个链接了解更多信息:https://github.com/pypa/pip/issues/1291。按照@YRUsoDiao的建议设置PYTHONIOENCODING并不能解决这个问题,因为这个环境变量只影响标准输入、输出和错误输出。目前,如果你的setup.py模块中包含除了纯ASCII以外的utf-8字符,你需要在运行“pip install”之前,将你的Windows账户设置为使用CP65001(UTF-8)。
这其实是个变通办法,并不是解决问题的真正方法。我在Windows里的用户名自动变成了“Šimon”。这个“Š”就成了个麻烦。我找到了一种方法来改用户名,但之后很多东西都不工作了。Windows注册表里到处都是“Šimon”,我不得不用一个特殊工具一次性把它们都改掉,结果用户文件夹里的很多链接也失效了。包括%APPDATA%和其他类似的文件夹,所以很多软件都不工作了,启动时出现了意外错误,比如Dropbox、XMind等等。
所以如果能从根本上解决这个问题就好了,因为这个变通办法执行起来相当复杂,而且它仍然没有真正解决问题。
因为Python不知道“cp65001”其实是“utf-8”的别名。你可以在Windows系统中设置这个:
set PYTHONIOENCODING=utf-8