Re: [python] Nastavení default kódování print-u (je?t? jednou)
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)
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)
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)
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
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