Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 5, 2010 05:25:11

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

В очередной раз про кодировки :(

потихоньку пытаюсь осваивать 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, выводить на консоль русский текст



Офлайн

#2 Окт. 5, 2010 07:01:08

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

В очередной раз про кодировки :(

пока победил вот так:

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()
вопрос: на сколько это правильно?



Офлайн

#3 Окт. 5, 2010 12:39:32

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

В очередной раз про кодировки :(

Можно и так.
Я бы сказал, что проблема не в питоне а в cx_freeze.



Офлайн

#4 Окт. 5, 2010 13:39:26

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

В очередной раз про кодировки :(

Андрей Светлов
Я бы сказал, что проблема не в питоне а в cx_freeze.
тогда уж скорее так: не только в питоне :).
“отсутствие проблем с кодировкой” местами вообще не обходится. если в имени папки есть русские буквы, то модуль loggin не может создать лог-файл, возникают непобедимые проблемы с импортом… и это только на второй день вялой попытки взяться за третий питон :(



Офлайн

#5 Окт. 5, 2010 14:06:56

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

В очередной раз про кодировки :(

pyuser
… и это только на второй день вялой попытки взяться за третий питон :(
Попытки не должны быть вялыми :)



Отредактировано (Окт. 5, 2010 14:07:55)

Офлайн

#6 Окт. 5, 2010 19:57:12

guranvir
От:
Зарегистрирован: 2010-03-16
Сообщения: 186
Репутация: +  0  -
Профиль   Отправить e-mail  

В очередной раз про кодировки :(

Ну мне то кажется проблема не столько в Python онна в большей степени в XP. Например у меня на Ubuntu обычно все проблемы решает принудительное указание кодировки UTF-8:

 # -*- coding: utf-8 -*-



Офлайн

#7 Окт. 6, 2010 02:19:08

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

В очередной раз про кодировки :(

guranvir
все проблемы решает принудительное указание кодировки UTF-8
Вы не поверите, у меня тоже все скрипты начинаются со строки
# -*- mode: python; coding: utf-8 -*-
и проблем, почему-то, меньше не становится, в том числе и на ubuntu (хотя тут скорее всего, просто не знание самой оси). Проблемы с импортом, если верить гуглу, вообще не зависят от оси
Isem
Попытки не должны быть вялыми
согласен. взяться бодро мешает банальное отсутствие трех библиотек: wxPython, xlrd, xlwt



Офлайн

#8 Окт. 19, 2010 21:28:40

Didis
От:
Зарегистрирован: 2010-01-17
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

В очередной раз про кодировки :(

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 возвращает данные на русском в правильной кодировке.



Офлайн

#9 Окт. 20, 2010 04:07:54

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

В очередной раз про кодировки :(

2Didis. вообще-то все, что написано выше, относится к третьему питону :)



Отредактировано (Окт. 20, 2010 04:08:48)

Офлайн

#10 Окт. 21, 2010 21:44:36

Didis
От:
Зарегистрирован: 2010-01-17
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

В очередной раз про кодировки :(

pyuser
2Didis. вообще-то все, что написано выше, относится к третьему питону :)
Сорри, не догнал, иззчизаю.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version