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ý


_______________________________________________
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python

Odpovedet emailem