Форум сайта python.su
потихоньку пытаюсь осваивать python 3.1 и буквально сразу наступил на грабли с кодировкой :( (это после всеобщей радости от того, что проблемы с кодировками наконец-то исчезнут :()
суть проблемы в следующем:
ось winxp, python 3.1
есть скрипт, который по ходу своей работы выводит на консоль результаты своей деятельности (на русском языке)
скрипт можно запускать с различными параметрами (модуль argparse), комментарии к параметрам тоже на русском языке
на ПК, где подразумевается работа скрипта, python не установлен (не беда, есть py2exe)
при работе со вторым питоном ни каких проблем с выводом на консоль параметров с их описаниями и результатов работы не было (т.е. и скрипт и exe, собранный py2exe, работали совершенно одинаково)
после перехода на 3.1 скрипт работает так, как от него и ожидалось, т.е. к выводу на консоль ни каких притензий, а вот exe-шник, собранный cx_Freeze, выводит всякие кракозябры
во втором питоне проблемы с выводом решались вставкой строки:
sys.stdout = codecs.getwriter('cp866')(sys.stdout, errors='replace')
File "C:\Python31\lib\site-packages\argparse.py", line 2319, in print_help
self._print_message(self.format_help(), file)
File "C:\Python31\lib\site-packages\argparse.py", line 2333, in _print_message
file.write(message)
File "X:\Python31-x32\lib\codecs.py", line 356, in write
TypeError: must be str, not bytes
Офлайн
пока победил вот так:
if "__main__" == __name__:
if hasattr(sys, "frozen") :
import codecs, locale
sys.stdout = sys.stdout.detach()
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(
sys.stdout, errors='replace')
main()
Офлайн
Можно и так.
Я бы сказал, что проблема не в питоне а в cx_freeze.
Офлайн
Андрей Светловтогда уж скорее так: не только в питоне :).
Я бы сказал, что проблема не в питоне а в cx_freeze.
Офлайн
pyuserПопытки не должны быть вялыми :)
… и это только на второй день вялой попытки взяться за третий питон :(
Отредактировано (Окт. 5, 2010 14:07:55)
Офлайн
Ну мне то кажется проблема не столько в Python онна в большей степени в XP. Например у меня на Ubuntu обычно все проблемы решает принудительное указание кодировки UTF-8:
# -*- coding: utf-8 -*-
Офлайн
guranvirВы не поверите, у меня тоже все скрипты начинаются со строки
все проблемы решает принудительное указание кодировки UTF-8
# -*- mode: python; coding: utf-8 -*-
Isemсогласен. взяться бодро мешает банальное отсутствие трех библиотек: wxPython, xlrd, xlwt
Попытки не должны быть вялыми
Офлайн
http://python.su/forum/viewtopic.php?id=5046
В комментах то, что не помогало.
# ничего # -*- coding: utf-8 -*-
import sys, os#, codecs
from Tkinter import *
# ничего #sys.stdout = codecs.getwriter('cp866')(sys.stdout, errors='replace')
# реальный путь D:/Temp/Русский язык
my_path=(sys.path).decode('cp1251') # !!! спасло ****************
#.encode('mbsc')
# LookupError: unknown encoding: mbsc
#.decode()
# UnicodeDecodeError: ‘ascii’ codec can't decode byte 0xd0
# in position 8: ordinal not in range(128)
print sys.path
root=Tk()
path_var=StringVar()
path_var.set(my_path)
Label(root,textvariable=path_var).grid(column=0,row=0,padx=5,pady=5)
root.mainloop()
p.s. кривизна отображения русского языка не мешает работать с файлами через os.path.walk(). Виджет FileDilog пакета Tkinter возвращает данные на русском в правильной кодировке.
Офлайн
2Didis. вообще-то все, что написано выше, относится к третьему питону :)
Отредактировано (Окт. 20, 2010 04:08:48)
Офлайн
pyuserСорри, не догнал, иззчизаю.
2Didis. вообще-то все, что написано выше, относится к третьему питону :)
Офлайн