4

Python引发WindowsError时很麻烦,异常消息的编码始终是os-native-encoded。例如:

import os
os.remove('does_not_exist.file')

好吧,这里我们得到一个例外:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
WindowsError: [Error 2] 系統找不到指定的檔案。: 'does_not_exist.file'

由于我的 Windows7 的语言是繁体中文,所以我收到的默认错误消息是 big5 编码(称为 CP950)。

>>> try:
...     os.remove('abc.file')
... except WindowsError, value:
...     print value.args
...
(2, '\xa8t\xb2\xce\xa7\xe4\xa4\xa3\xa8\xec\xab\xfc\xa9w\xaa\xba\xc0\xc9\xae\xd7\xa1C')
>>>

正如您在此处看到的,错误消息不是 Unicode,那么当我尝试打印它时,我会得到另一个编码异常。这是问题,可以在 Python 问题列表中找到:http: //bugs.python.org/issue1754

问题是,如何解决这个问题?如何获取 WindowsError 的本机编码?我使用的 Python 版本是 2.6。

谢谢。

4

3 回答 3

4

我们在俄罗斯版的 MS Windows 中遇到了同样的问题:默认语言环境的代码页是cp1251,但 Windows 控制台的默认代码页是cp866

>>> import sys
>>> print sys.stdout.encoding
cp866
>>> import locale
>>> print locale.getdefaultlocale()
('ru_RU', 'cp1251')

解决方案应该是使用默认语言环境编码解码 Windows 消息:

>>> try:
...     os.remove('abc.file')
... except WindowsError, err:
...     print err.args[1].decode(locale.getdefaultlocale()[1])
...

坏消息是您仍然无法exc_info=Truelogging.error().

于 2010-04-20T21:28:56.487 回答
0

sys.getfilesystemencoding()应该有帮助。

import os, sys
try:
    os.delete('nosuchfile.txt')
except WindowsError, ex:
    enc = sys.getfilesystemencoding()
    print (u"%s: %s" % (ex.strerror, ex.filename.decode(enc))).encode(enc)

除了打印到控制台之外,您可能需要将最终编码更改为“utf-8”

于 2010-04-19T15:20:20.943 回答
0

这只是同一错误消息的 repr() 字符串。由于您的控制台已经支持 cp950,因此只需打印您想要的组件。在我的控制台中重新配置为使用 cp950 后,这适用于我的系统。由于我的系统是英文而不是中文,因此我必须明确提出错误消息:

>>> try:
...     raise WindowsError(2,'系統找不到指定的檔案。')
... except WindowsError, value:
...     print value.args
...
(2, '\xa8t\xb2\xce\xa7\xe4\xa4\xa3\xa8\xec\xab\xfc\xa9w\xaa\xba\xc0\xc9\xae\xd7\xa1C')
>>> try:
...     raise WindowsError(2,'系統找不到指定的檔案。')
... except WindowsError, value:
...     print value.args[1]
...
系統找不到指定的檔案。

或者,使用 Python 3.X。它使用控制台编码打印 repr()。这是一个例子:

Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> '系統找不到指定的檔案。'
'\xa8t\xb2\xce\xa7\xe4\xa4\xa3\xa8\xec\xab\xfc\xa9w\xaa\xba\xc0\xc9\xae\xd7\xa1C'

Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> '系統找不到指定的檔案。'
'系統找不到指定的檔案。'
于 2010-04-20T05:49:30.860 回答