[python] Nastavení default kódování print-u (je?t? jednou)
Petr Přikryl
prikryl na atlas.cz
Úterý Duben 19 16:59:51 CEST 2011
Ať se na to díváš jak chceš, vždycky někde nastane nějaká
komplikace. Problém je v tom, že string v Pythonu 2.x je posloupnost
bajtů a informace o kódování u toho není zachycena.
Nakonec jsem dospěl k tomu, že je nutné používat unicode řetězce
(i v Pythonu 2). Zatím to může být v reálném provozu utopie, ale
je dobré se pomalu přeorientovávat na Python 3.
Petr
______________________________________________________________
> zu1234 napsal
>
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
------------
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
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ý
>
>
_______________________________________________
Python mailing list
Python na py.cz
http://www.py.cz/mailman/listinfo/python
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20110419/78fb1501/attachment.html>
Další informace o konferenci Python