vitus_wagner: My photo 2005 (Default)
[personal profile] vitus_wagner
Обнаружил в своем питоновском скрипте проблему - если вывод направлен на терминал, оно работает нормально. Если вывод переназначен в пайп или файл, то делает шлеп по первому же русскому символу, говорит что не может его перекодировать кодеком ascii.

import sys
print "stdout=",sys.stdout.encoding
print "stdin=",sys.stdin.encoding

показывает, что у непереназначенного стандартного файла encoding соответствует текущей локали,
а у переназначенного - None.

Если сделать

import locale
locale.setlocale(locale.LC_CTYPE,'')

то кодировка None оказывается вполне совпадающей с тем, что ожидалось, и русские буквы нормально выводятся в пайп или файл. Т.е. собственно вызов setlocale проблему решает.

Вопрос в том - как этот гад ползучий ухитряется узнать в какой кодировке должны быть stdin и stdout, не делая вызовов setlocale и nl_langinfo(CODESET)?

В исходники его мне лезть лень. Но я знаю что меня читают минимум два человека, которые туда лазили. Может быть вы знаете ответ?

P.S. Все гораздо хуже. А вот если в исходнике написано # -*- coding: что-нибудь -*-
и что-то вроде print u'Привет' то просто установка локали в случае переназначения ввода-вывода
не помогает. Надо sys.setdefaultencoding делать. А эта функция доступна только при явном отключении загрузки модуля site (опция -S). Блин, я убью этого голландца.

Date: 2009-09-16 10:42 pm (UTC)
From: [personal profile] ramendik
Интересно, а чем тебя дожало до питона?

Date: 2009-09-17 06:23 am (UTC)
From: [identity profile] roman_sharp.livejournal.com
Python at Google (Greg Stein - SDForum) (http://panela.blog-city.com/python_at_google_greg_stein__sdforum.htm)

...

Attitudes toward Python

* 1995 - eShop - What is python?
* 1996 - eShop - Python is great and making us successful
* 1997 - MS (acquired eShop) - Shipped embedded python in their product
* 1998 - MS - We are using python? That was a "prototype". Let's re-write it. (The re-write in .asp was slower)
* 2001 - Collabnet - We don't use python
* 2003 - Collabnet - Write that in python
* 2005 - Google - Of course we use python


В поисках как-то выносило на вполне змеиные страницы Гугла.

(no subject)

From: [identity profile] b-al-u.livejournal.com - Date: 2009-09-17 07:18 am (UTC) - Expand

Date: 2009-09-16 10:43 pm (UTC)
From: [identity profile] dottedmag.livejournal.com
Лично я делаю просто: не пишу Unicode туда, где поток байт, без явной перекодировки.

Ты же знаешь, что Unicode в py2 - это afterthought.

(no subject)

From: [identity profile] dottedmag.livejournal.com - Date: 2009-09-17 08:53 am (UTC) - Expand

Date: 2009-09-16 10:56 pm (UTC)
From: [identity profile] dreams4rent.livejournal.com
Извращаемся в стиле
import sys, codecs, locale

if sys.stdout.encoding is None:
	enc = locale.getpreferredencoding()
	if enc is not None:
		sys.stdout = codecs.lookup(enc).streamwriter(sys.stdout)

А вообще грустно все это, да.

Date: 2009-09-16 11:14 pm (UTC)
From: [identity profile] slobin.livejournal.com
Как ПРАВИЛЬНО, я и сам толком не знаю (и тебе ещё везёт -- под Win32, похоже, вообще нельзя спросить OEM кодировку, а в консоли именно она), но, если ОЧЕНЬ ХОЧЕТСЯ дёрнуть за setdefaultencoding, то -S делать не надо, а надо в sitecustomize.py либо usercustomize.py написать:
import sys

sys.setappdefaultencoding = sys.setdefaultencoding

И потом уже дёргать за копию. Я не знаю, почему это опасно (Гвидо не стал бы зря прятать полезную функцию), но, если вызвать её достаточно рано, то ничего вроде не ломается. По крайней мере, в своих написанных на Питоне приладах для Вима я этим пользуюсь. Правда, под Вин32, под нормальной системой ещё не успел проверить.

P.S. setappdefaultencoding -- имя произвольное, но так было в том месте, где я прочитал эту идею, и мне оно понравилось.

... Имя Бо Яна известно всем китайцам ...

Date: 2009-09-16 11:21 pm (UTC)
From: [identity profile] slobin.livejournal.com
А, нет, usercustomize появилось только в 2.6, которого почти нигде нет. Так что только sitecustomize. Бардак!

... А если сломается время - мы его тоже починим? ...

(no subject)

From: [identity profile] b-al-u.livejournal.com - Date: 2009-09-17 06:37 am (UTC) - Expand

(no subject)

From: [identity profile] dzz.livejournal.com - Date: 2009-09-17 07:01 am (UTC) - Expand

(no subject)

From: [identity profile] b-al-u.livejournal.com - Date: 2009-09-17 07:10 am (UTC) - Expand

(no subject)

From: [identity profile] dzz.livejournal.com - Date: 2009-09-17 10:28 am (UTC) - Expand

(no subject)

From: [identity profile] roman_sharp.livejournal.com - Date: 2009-09-17 10:42 am (UTC) - Expand

(no subject)

From: [identity profile] dzz.livejournal.com - Date: 2009-09-17 11:30 am (UTC) - Expand

(no subject)

From: [identity profile] dil.livejournal.com - Date: 2009-09-17 12:11 pm (UTC) - Expand

Date: 2009-09-17 03:08 am (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
питон не предназначен для серьезных проектов, да

(no subject)

From: [identity profile] dzz.livejournal.com - Date: 2009-09-17 06:56 am (UTC) - Expand

(no subject)

From: [identity profile] potan.livejournal.com - Date: 2009-09-17 07:26 am (UTC) - Expand

(no subject)

From: [identity profile] dzz.livejournal.com - Date: 2009-09-17 07:31 am (UTC) - Expand

(no subject)

From: [identity profile] potan.livejournal.com - Date: 2009-09-17 07:49 am (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/_slw/ - Date: 2009-09-17 12:40 pm (UTC) - Expand

(no subject)

From: [personal profile] phd_ru - Date: 2009-09-17 03:07 pm (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/_slw/ - Date: 2009-09-17 09:11 pm (UTC) - Expand

(no subject)

From: [personal profile] phd_ru - Date: 2009-09-18 09:20 am (UTC) - Expand

Date: 2009-09-17 06:26 am (UTC)
From: [identity profile] roman_sharp.livejournal.com
Его в Google используют.

(no subject)

From: [identity profile] b-al-u.livejournal.com - Date: 2009-09-17 06:40 am (UTC) - Expand

(no subject)

From: [identity profile] roman_sharp.livejournal.com - Date: 2009-09-17 08:06 am (UTC) - Expand

(no subject)

From: [identity profile] besm6.livejournal.com - Date: 2009-09-17 09:02 am (UTC) - Expand

(no subject)

From: [identity profile] besm6.livejournal.com - Date: 2009-09-17 09:44 am (UTC) - Expand

(no subject)

From: [identity profile] roman_sharp.livejournal.com - Date: 2009-09-17 10:39 am (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/_slw/ - Date: 2009-09-17 12:41 pm (UTC) - Expand

Date: 2009-09-17 06:53 am (UTC)
From: [identity profile] dzz.livejournal.com
Угу, он предназначен только для легкомысленных и совсем смешных ;)

На самом деле, ни на чём не основанное суждение. Проекты бывают разные.

(no subject)

From: [identity profile] http://users.livejournal.com/_slw/ - Date: 2009-09-17 12:42 pm (UTC) - Expand

(no subject)

From: [identity profile] dzz.livejournal.com - Date: 2009-09-17 12:56 pm (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/_slw/ - Date: 2009-09-17 09:15 pm (UTC) - Expand

(no subject)

From: [identity profile] dzz.livejournal.com - Date: 2009-09-18 06:28 am (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/_slw/ - Date: 2009-09-18 07:11 am (UTC) - Expand

(no subject)

From: [identity profile] dzz.livejournal.com - Date: 2009-09-18 08:07 am (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/_slw/ - Date: 2009-09-18 08:30 am (UTC) - Expand

(no subject)

From: [identity profile] dzz.livejournal.com - Date: 2009-09-18 08:46 am (UTC) - Expand

Date: 2009-09-17 09:28 am (UTC)
phd_ru: (Default)
From: [personal profile] phd_ru
Ни на чём не основанная чушь, да. На Python прекрасно пишутся успешные проекты по 100k строк, которые живут и развиваются по многу лет.

(no subject)

From: [identity profile] http://users.livejournal.com/_slw/ - Date: 2009-09-17 12:42 pm (UTC) - Expand

(no subject)

From: [identity profile] dzz.livejournal.com - Date: 2009-09-17 02:39 pm (UTC) - Expand

Date: 2009-09-18 10:44 am (UTC)
From: [identity profile] http://users.livejournal.com/_nik_/
Определите ваше понимание термина «серьезные проекты», пожалуйста.
В моем понимании данного термина серьёзные проекты на питоне таки вполне пишутся и не сказать, чтобы приходилось с питоном для этого серьёзно воевать.

Date: 2009-09-17 05:14 am (UTC)
From: [identity profile] dzz.livejournal.com
Гы, я с проблемой кодировок в 2.х уже давно борюсь :)

Вопрос, разумеется, в кодеках, которые имеют к локали весьма опосредованное отношение. Дефолтный кодек в питоне - 'ascii', он не пропускает юникода.

Наиболее дешёвым вариантом вывода юникода куда угодно является насильное преобразование из типа юникод в тип стринг следующего вида:

u'Привет, мерзавцы'.encode('utf-8').

А вот за что убить голландца таки надо - так это за отдельный тип unicode :)

(no subject)

From: [identity profile] dzz.livejournal.com - Date: 2009-09-17 06:48 am (UTC) - Expand

(no subject)

From: [identity profile] otmenych.livejournal.com - Date: 2009-09-17 11:41 am (UTC) - Expand

Date: 2009-09-17 09:31 am (UTC)
phd_ru: (Default)
From: [personal profile] phd_ru
В Python3 нет отдельного типа unicode, там все строковые операции юникодные. Но, конечно, там есть отдельный тип "строка байтов".

(no subject)

From: [identity profile] dzz.livejournal.com - Date: 2009-09-17 10:14 am (UTC) - Expand

Date: 2009-09-17 06:31 am (UTC)
From: [identity profile] buriy.livejournal.com
вот никогда таких проблем как у тебя не было.
нефиг пытаться писать unicode в ascii файл.
надо делать так:
buriy@bur-mac:~$ python > 123
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print u"Привет"
Traceback (most recent call last):
  File "", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)
>>> print u"Привет".encode('utf-8') # or
>>> print u"Привет".encode('utf-16') #Unicode16-LE
и всё ок!

Date: 2009-09-17 06:34 am (UTC)
From: [identity profile] buriy.livejournal.com
вообще, зачем себе создавать лишний геморрой, вдруг твоим скриптам понадобятся символы не из sysencoding. оно и вылетит тогда, как с ascii.

(no subject)

From: [identity profile] dottedmag.livejournal.com - Date: 2009-09-17 09:08 am (UTC) - Expand

(no subject)

From: [personal profile] phd_ru - Date: 2009-09-17 09:32 am (UTC) - Expand

(no subject)

From: [identity profile] otmenych.livejournal.com - Date: 2009-09-17 11:43 am (UTC) - Expand

Date: 2009-09-17 06:32 am (UTC)
From: [identity profile] alexcrown.livejournal.com
Установить дефолтную локаль в 2.5 можно так:
import sys; reload(sys); sys.setdefaultencoding(encoding)

Рецепт тут: http://lxj.endofinternet.net/blog/2009/02/encodings-in-python/

Date: 2009-09-17 09:25 am (UTC)
phd_ru: (Default)
From: [personal profile] phd_ru
1. В Python2 все файловые операции должны выполняться с байтами. Не пиши unicode в stdout, подожди Python3. Если в Python2 запись unicode в файл сработала - это случайно, не полагайся на случайное везение.

2. locale.getdefaultlocale(), locale.getpreferredencoding() и sys.getdefaultencoding() можно вызвать, не вызывая setlocale().

3. sys.setdefaultencoding() делать нельзя. Я когда-то делал, и получал многочисленные советы перестать - нарвёшься на проблемы. Я нарвался на проблемы, перестал, и теперь присоединяюсь к хору и другим советую перестать.

Date: 2009-09-17 02:20 pm (UTC)
From: [identity profile] slobin.livejournal.com
3. А какие именно проблемы? Я ни в чём большом так делать не рискую, но в тридцати строчках внутри _vimrc, наверное, можно: в крайнем случае упадёт vim. ;-) И уж в любом случае не reload(sys) -- при указанном мной способе проблемы, в крайнем случае, вызовет сама setdefaultencoding, а при перезагрузке sys -- вообще всё, что угодно, в том числе и не имеющее к кодировкам никакого отношения.

... Не рой другому яму сам! ...

(no subject)

From: [personal profile] phd_ru - Date: 2009-09-17 03:14 pm (UTC) - Expand

Date: 2009-09-17 01:16 pm (UTC)
From: [identity profile] olpa.livejournal.com
http://uucode.com/blog/2007/03/23/shut-up-you-dummy-7-bit-python/
Многие мои программы начинаются так:

import Locale
Locale.force_utf8_hack()


где Locale.py:

import sys, locale, os

def force_utf8_hack():
  reload(sys)
  sys.setdefaultencoding('utf-8')
  for attr in dir(locale):
    if attr[0:3] != 'LC_':
      continue
    aref = getattr(locale, attr)
    locale.setlocale(aref, '')
    (lang, enc) = locale.getlocale(aref)
    if lang != None:
      try:
        locale.setlocale(aref, (lang, 'UTF-8'))
      except:
        os.environ[attr] = lang + '.UTF-8'

Date: 2009-09-18 07:36 am (UTC)
From: [identity profile] ilya-portnov.livejournal.com
А я примерно так делаю:

import locale
ENCODING = locale.getpreferredencoding()
...
print u"ляляля".encode(ENCODING)

Обычно оказывается ENCODING=='utf-8', но мало ли чего...

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

April 2026

S M T W T F S
    123 4
5 6 7 89 1011
12 13 1415161718
19202122232425
2627282930  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 14th, 2026 06:50 pm
Powered by Dreamwidth Studios