локализация в Python

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение Olej » 29 авг 2013, 22:12

alex65su писал(а):
Olej писал(а): Это как-раз то, о чего и я хочу добиться: текст программы исключительно в UTF-8, без всяких Windows-ных задрочек :evil: ...
Судя по выданным результатам запуска примеров, у Вас с Викторией, кажись, Python разных версий (у Виктории: Python 2.7.5; у Olej: Python 3.3.2).
Насколько слышал, Python 2 и Python 3 в этом вопросе имеют какие-то различия (с Python 3 дела не имел).
Статья, кстати, рассматривает Python 2.
Да, сначала так и было: я использовал в Windows 3.3.2, и, похоже, как-раз в Python 3 никаких проблем с переносимостью не возникало.
Но поскольку в Python 2 это было не так, то я специально установил (в Windows под VirtualBox) именно Python 2.7.5 ... и здесь вот начались чудеса.
(это я коротко повторил ... "содержание предыдущих серий" ;-) , чтобы не заставлять вас шерстить всё обсуждение с начала)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение Olej » 29 авг 2013, 22:49

alex65su писал(а):Статья, кстати, рассматривает Python 2.
Да, но непонятно какую версию :-o
12 апреля 2011
Обсуждений там много + можно вынести что-то полезное ... но!:
- всё логическое построение статьи крутится вокруг вызова sys.setdefaultencoding()
- но у меня:

Код: Выделить всё

bash-4.2$ python --version
Python 2.7.3
- и в этой версии:

Код: Выделить всё

bash-4.2$ python 
Python 2.7.3 (default, Jul 24 2012, 10:05:39) 
[GCC 4.7.0 20120507 (Red Hat 4.7.0-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import locale
>>> encod = locale.getpreferredencoding()
>>> print encod
UTF-8
>>> sys.setdefaultencoding( encod )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'setdefaultencoding'
>>> 
- в ней в модуле sys просто нет вызова setdefaultencoding,
- хотя версия Python более поздняя, чем дата написания статьи :-?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение Olej » 29 авг 2013, 23:19

Olej писал(а): - в ней в модуле sys просто нет вызова setdefaultencoding,
В Windows:

Код: Выделить всё

C:\Python-test\Tkinter\Py2>c:\Python27\python.exe --version
Python 2.7.5
И та же история (в IDLE):
1.png
1.png (10.4 КБ) 4338 просмотров

alex65su
Писатель
Сообщения: 40
Зарегистрирован: 13 дек 2012, 10:27
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение alex65su » 30 авг 2013, 09:24

В ранних версиях Python 2 функция

Код: Выделить всё

sys.setdefaultencoding
была доступна из пользовательского кода. Поэтому в некоторых публикациях она упоминается. Позже, ее "закрыли" для использования в пользовательском коде путём

Код: Выделить всё

del sys.setdefaultencoding
в модуле "site.py". Насколько помню (давно с этим возился), этот модуль вызывается при каждом запуске интерпретатора для его настройки, а вот формируется/настраивается он ("site.py") на этапе сборки Python на конкретной системе.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение Olej » 30 авг 2013, 14:09

alex65su писал(а):В ранних версиях Python 2 функция

Код: Выделить всё

sys.setdefaultencoding
была доступна из пользовательского кода. Поэтому в некоторых публикациях она упоминается. Позже, ее "закрыли" для использования в пользовательском коде путём

Код: Выделить всё

del sys.setdefaultencoding
в модуле "site.py". Насколько помню (давно с этим возился), этот модуль вызывается при каждом запуске интерпретатора для его настройки, а вот формируется/настраивается он ("site.py") на этапе сборки Python на конкретной системе.
За разъяснение спасибо.
Именно поэтому и работает вот такой трюк, который я позже нашёл, но не мог его истолковать (после reload() и метод появился):

Код: Выделить всё

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import locale

reload( sys )

encod = locale.getpreferredencoding()
sys.setdefaultencoding( locale.getpreferredencoding() )

print "русская строка в UTF-8"

Код: Выделить всё

bash-4.2$ ./hlock2.py
русская строка в UTF-8
Только, к сожалению, у меня это не работает в Windows и Python 2 (нынешний, 2.7.5) - всё те же "краказябры".
Может кто более удачливый и получит нужный результат? ;-)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение Olej » 12 июн 2015, 16:49

Как промежуточный итог (то что наблюдалось):

1. в Windows XP с установленным Python 3.3.2 никаких проблем с консольными приложениями, похоже, не возникает - перенесенные из Linux UTF-8 файлы непосредственно выполняются:
Изображение

2. но вот с Python 2.7.5, который на сегодня самый массово применяемый (в Ubuntu только к последней версии 14.Х происходит переход к Python 3) - тут возникают проблемы с консольными приложениями, и то же приложение, что и выше, выглядит ... несколько по-другому ;-) :

Код: Выделить всё

Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
число процессоров (ядер) = 2
исполнение в Python версия 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]
число ветвей выполнения 2
число циклов в ветви 10000000
============ последовательное выполнение ============
время 1.98 секунд
================ параллельные потоки ================
время 2.77 секунд
=============== параллельные процессы ===============
error: create child process
>>> 
3. С GUI приложениями, похоже, проблем с локализацией не должно возникать ... по крайней мере, так видно было при использовании для графики Python модуля Tkinter.
Изображение
Но это может зависеть и от используемого GUI фреймворка (модуль pygame, PyQt, PyGTK, wxPython, ... ). Проблемы здесь не очень вероятны ... но могут и вылезть, хорошо бы глянуть.

4. Но ... в Windows 7 начинаются свои проблемы:
- инсталятор .msi Python 2.7.5 здесь просто отказывается устанавливаться ... почему? - это для меня загадка;
- Python 3.3.2 - устанавливается нормально ...
- но при выводе русскоязычных строк UTF-8 начинаются свои чудеса: строка выводится, но по завершению её вывода возбуждается исключение...
- конечно, можно все print() обложить try и ликвидировать исключения ... но это опять геморой :-x ...
P.S. Этот пункт я попросил бы кого-то проверить, т.к. я это наблюдаю в виртуальном Windows 7 под VirtualBox ... хотя ничего подобного я ведь не наблюдаю в столь же виртуальном Windows XP под тем же VirtualBox? ;-)

5. в Windows 8 начнутся очередные свои задрочки...
В Windows нельзя без задрочек, чтоб жизнь пресной не казалась! :lol:


Тема поднималась пользователем Olej 12 июн 2015, 16:49.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей