Найти - Пользователи
Полная версия: В очередной раз про кодировки :(
Начало » Python для новичков » В очередной раз про кодировки :(
1
pyuser
потихоньку пытаюсь осваивать 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
подскажите, как мне заставить exe-шник, собранный cx_Freeze, выводить на консоль русский текст
pyuser
пока победил вот так:
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.
pyuser
Андрей Светлов
Я бы сказал, что проблема не в питоне а в cx_freeze.
тогда уж скорее так: не только в питоне :).
“отсутствие проблем с кодировкой” местами вообще не обходится. если в имени папки есть русские буквы, то модуль loggin не может создать лог-файл, возникают непобедимые проблемы с импортом… и это только на второй день вялой попытки взяться за третий питон :(
Isem
pyuser
… и это только на второй день вялой попытки взяться за третий питон :(
Попытки не должны быть вялыми :)
guranvir
Ну мне то кажется проблема не столько в Python онна в большей степени в XP. Например у меня на Ubuntu обычно все проблемы решает принудительное указание кодировки UTF-8:
 # -*- coding: utf-8 -*-
pyuser
guranvir
все проблемы решает принудительное указание кодировки UTF-8
Вы не поверите, у меня тоже все скрипты начинаются со строки
# -*- mode: python; coding: utf-8 -*-
и проблем, почему-то, меньше не становится, в том числе и на ubuntu (хотя тут скорее всего, просто не знание самой оси). Проблемы с импортом, если верить гуглу, вообще не зависят от оси
Isem
Попытки не должны быть вялыми
согласен. взяться бодро мешает банальное отсутствие трех библиотек: wxPython, xlrd, xlwt
Didis
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 возвращает данные на русском в правильной кодировке.
pyuser
2Didis. вообще-то все, что написано выше, относится к третьему питону :)
Didis
pyuser
2Didis. вообще-то все, что написано выше, относится к третьему питону :)
Сорри, не догнал, иззчизаю.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB