[python] Nastavení default kódování print-u (je?t? jednou)

zu1234 zu1234 na seznam.cz
Úterý Duben 19 14:18:05 CEST 2011


Děkuji za krásné uvedení do problému!!

K obsluze kódování na výstupu z programů
jsem začal používat codecs.getwriter(...)
jak mi zde bylo poraděno.

Pod windows mi to například umožňuje nastavit
stdout (který jde do souboru) na cp1250
a strerr (který jde na terminál) na cp852.

Je to dobré řešení až na jeden problém:
Pokud nastavím kódování i na stderr a nastane
chyba při běhu programu na řádku obsahujícím
české znaky, nezobrazí se popis chyby.
To trochu komplikuje ladění programu.

Nevím jak to odstranit.

Například:

-----------
Varianta s sys.stderr = codecs.getwriter ....
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import codecs

sys.stderr = codecs.getwriter('cp852')(sys.stderr)

print "ššš %s" % ()

-----------
Chybové hlášení částečné:
Traceback (most recent call last):
   File "x.py", line 10, in <module>

------------
Varianta bez sys.stderr = codecs.getwriter ....
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import codecs

# sys.stderr = codecs.getwriter('cp852')(sys.stderr)

print "ššš %s" % ()


-----------
Chybové hlášení úplné:
Traceback (most recent call last):
   File "x.py", line 9, in <module>
     print "ššš %s" % ()
TypeError: not enough arguments for format string



Dne 19.4.2011 12:30, Filip Štědronský napsal(a):
> Dne 22.3.2011 14:38:22 napsal zu1234:
>> Ale mohl by mi někdo vysvětlit proč to nejde bez reload?
>>
>> #!/usr/bin/python
>> # -*- coding: utf-8 -*-
>>
>> import sys
>> reload(sys)
>>
>> if sys.stdout.isatty():
>>       # Výstup jde na terminál:
>>       sys.setdefaultencoding('cp852')
>> else:
>>       # Výstup jde do souboru:
>>      sys.setdefaultencoding('cp1250')
>>
>> print u'šílené'
>
> Ahoj,
> tohle všechno je způsobeno tím, že funkce setdefaultencoding
> není tak úplně určena pro uživatele. Při startu Pythonu se
> automaticky importuje modul site.py, který se stará o všechny
> možné druhy nastavení a inicializací a který je podle potřeby
> možné přizpůsobit podle potřeb cílové platformy a/nebo
> administrátora. Tam se mimo jiné volá funkce setdefaultencoding
> s nějakou hodnotou, kterou to považuje za "rozumnou" pro dané
> prostředí (v linuxu se to snaží uhodnout podle locale, na oknech
> to nejspíš bude vždy ascii). A poté, co to udělá, prostě funkci
> setdefaultencoding z modulu sys smaže (aby si s ní nehráli
> programátoři --- neboť v dobré víře je nastavení kódování
> považováno za věc prostředí, do které Pythoní program, kterýžto
> by měl být na prostředí nezávislý, nemá co mluvit). Reloadem
> se sys vrátí do původního stavu, tedy včetně metody, kterou
> původně site smazal. Pro podrobnější informace doporučuji projít
> site.py někde v knihovních adresářích pythonu.
>
> Snad to dává aspoň trochu smysl
> Filip Štědronský
>
>


Další informace o konferenci Python