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

2011-04-19 Tema obsahu Filip Štědronský
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ý


-- 

regn...@seznam.cz  regn...@jabber.cz  http://regnarg.ofight.org/
V upřímné lásce nezáleží na tom, jak úžasného člověka potkáte;
důležité je, aby vám spolu bylo fajn. --anonym
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python

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

2011-04-19 Tema obsahu zu1234

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

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

2011-04-19 Tema obsahu Petr Přikryl
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@py.cz
http://www.py.cz/mailman/listinfo/python
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python

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

2011-04-19 Tema obsahu zu1234

1) O verzi pythonu nerozhoduji já, ale
tvůrci knihoven typu pymssql aj.

2) Ani když nepoužiju string, ale unicode
tak se problém neodstraní, chybová hláška není kompletní:

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

import sys
import codecs

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

print uššš %s % ()

sys.exit(0) #


Dne 19.4.2011 16:59, Petr Přikryl napsal(a):

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

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


Re: [python] Vytvoreni obrazovky

2011-04-19 Tema obsahu Visgean Skeloru
Ehm, když už jsme u té práce s terminálem, zná někdo nějaký modul na
vytváření oken v terminálu? Mám na mysli něco lehce použitelného, vím že je
tu urwid a ty curses ale obojí mi to přijde dost neohrabané. Asi
nejpoužitelnější mi přijde python-dialog ale ten zase neposkytuje moc věcí a
vypadá to že projekt už je dost dlouho bez vývoje (ale stále funkční)...


2011/4/18 David Rohleder da...@ics.muni.cz

 Osobně si myslím, že použití knihovny curses bude asi nejlepší, skryje
 rozdíly mezi jednotlivými typy terminálů a dá se kreslit třeba na určité
 místo, takže celkem použitelné, akorát asi zdlouhavé.


 Petr Messner píše v Po 18. 04. 2011 v 14:01 +0200:
  Ahoj,
 
  příkaz clear jen pošle na výstup speciální sekvenci, které tvůj
  terminál porozumí a smaže se:
 
  $ clear | hd
    1b 5b 48 1b 5b 32 4a  |.[H.[2J|
  0007
 
 
  Takže v Pythonu můžeš udělat to samé:
 
  print \x1b[H\x1b[2J
 
 
  Akorát ta speciální sekvence se může lišit podle typu terminálu - tomu
  už ale moc nerozumím, jde spíš o historické souvislosti.
 
 
  Nebo si ten příkaz clear můžeš spustit přímo z Pythonu:
 
  os.system('clear')
 
 
  PM
 
 
  2011/4/18 Petr Hráček phra...@gmail.com:
   Ahoj vsichni,
  
   chci se Vas zeptat na jednu drobnost tykajici se Linux obrazovky (ne
   GUI).
  
   Chtel bych vytvorit obrazovky tak, aby prvni 4 radky od vrchu meli
   strukturu jako:
   1) 
   2) 
   3) 
   4) 
   Vas vstup: --
  
  
   a az do konce obrazovky prazdno. Lze to nejak udelat?
   V Perl existuje prikaz `clear`, ale v Pythonu jsem nic podobneho
   nenasel.
  
   Diky moc za rady
   Petr
   ___
   Python mailing list
   Python@py.cz
   http://www.py.cz/mailman/listinfo/python
  
  ___
  Python mailing list
  Python@py.cz
  http://www.py.cz/mailman/listinfo/python

 --
 
 David Rohleder da...@ics.muni.cz
 Institute of Computer Science, Masaryk University
 Brno, Czech Republic
 


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

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