Python - 另一个编码问题。 Windows 8.1,两个最新的蟒蛇。 pip抛出异常

时间:2014-08-23 20:18:21

标签: python unicode encoding

我在Windows 8.1机器上安装了一个干净的新版python。 我尝试了Python 2.7.8和Python 3.4。

我从命令提示符运行python get-pip.py - 这正确地安装了pip。我是从here获得的。

之后我运行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)

这种情况从未发生在我使用的任何其他机器上。我发现了许多类似的问题,但没有一个问题涉及我需要对我的案例做些什么。

This thread告诉我运行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

根据this thread,可能问题是,用户名是“Šimon”,包含一个unicode字符。但是,我不知道,该怎么办。我不是要将任何python文件编辑为不同的编码,这似乎只是一个非常困难和临时的解决方法。 (windows为我做了用户名 - 另一个糟糕的想法,不让我为我选择用户名。)

3 个答案:

答案 0 :(得分:2)

因为python不知道“cp65001”是“utf-8”的别名 你可以在windows中设置它:

set PYTHONIOENCODING=utf-8

答案 1 :(得分:1)

这是一种解决方法,而不是问题的解决方案。我在Windows中的用户名自动为“Šimon”。 “Š”是一个问题。我找到了重命名用户名的方法,但之后很多事情都停止了。 Windows注册表充满了散落在该地方的“Šimon”,必须使用特殊工具一次性重命名它们,并且用户文件夹中的许多链接停止工作。包括%APPDATA%和其他类似文件夹 - 因此许多软件停止工作,在启动时抛出意外错误,包括Dropbox,XMind等。

因此,如果问题是从根本上解决的话会很好,因为这种解决方法很难正确执行,但仍然无法解决问题。

答案 2 :(得分:0)

这是一个pip bug,两年后仍未正确修复。见https://github.com/pypa/pip/issues/1291。按照@YRUsoDiao的建议设置PYTHONIOENCODING不会解决问题,因为env var只影响stdin / stdout / stderr。现在,在运行&#34; pip install&#34;之前,您必须更改您的Windows帐户才能使用CP65001(UTF-8)。如果setup.py模块包含除纯ASCII之外的utf-8序列。