كيف تدور حول مشكلة Python "رسائل Windowserror غير مشفرة بشكل صحيح"؟

StackOverflow https://stackoverflow.com/questions/2668319

  •  28-09-2019
  •  | 
  •  

سؤال

إنها مشكلة عندما قام Python برفع Windowserror ، فإن ترميز رسالة الاستثناء دائمًا ما يكون مشفرًا عن نظام التشغيل. فمثلا:

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')
>>>

كما ترون هنا ، فإن رسالة الخطأ ليست أحادية الدهشة ، ثم سأحصل على استثناء ترميز آخر عندما أحاول طباعته. فيما يلي المشكلة ، يمكن العثور عليها في قائمة مشكلات Python:http://bugs.python.org/issue1754

والسؤال هو ، كيف ينقل هذا؟ كيف تحصل على الترميز الأصلي لنظام التشغيل Windowserror؟ إصدار Python الذي أستخدمه هو 2.6.

شكرًا.

هل كانت مفيدة؟

المحلول

لدينا نفس المشكلة في الإصدار الروسي من MS Windows: صفحة التعليمات البرمجية في اللغة الافتراضية cp1251, ، لكن صفحة التعليمات البرمجية الافتراضية في وحدة التحكم Windows هي صفحة 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=True في logging.error().

نصائح أخرى

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"

هذا هو مجرد سلسلة 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.
>>> '系統找不到指定的檔案。'
'系統找不到指定的檔案。'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top