cxFreeze a unicode
koval - 24-12-2006 00:55
cxFreeze a unicode
Czy ktos z Was uzywa cxFreeze na Linuksie ? Chcialem to 'cos' wyprobowac i napisalem krotki tescik.py :
# -*- coding: utf-8 -*- a=u'>> aA \u00f3\u0118\u017B zZ <<' print type(a),'=',a b=a.encode('latin2') print type(b),'=',b c=b.decode('latin2') print type(c),'=',c
interpreter Python'a wykonuje go jak najbardziej OK.
nastepnie pisze: FreezePython --install-dir dist tescik.py wchodze do utworzonego katalogu dist i uruchamiam: ../tescik w rezultacie dostaje : ....../cx_Freeze-3.0.3/initscripts/Console.py", line 27, in ? exec code in m.__dict__ File "tescik.py", line 3, in ? UnicodeEncodeError: 'ascii' codec can't encode characters in position 6-8: ordinal not in range(128)
blad w cxFreeze, czy ja cos robie zle ?
Rob Wolfe - 24-12-2006 00:55
koval napisał(a):
> blad w cxFreeze, czy ja cos robie zle ?
Metody encode i decode tak naprawdę korzystają z dodatkowych modułów w pakiecie encodings (w tym przypadku utf_8 i iso8559_2). Niestety biedny freeze o tym nie wie, więc dorzuć te importy:
import encodings.utf_8 import encodings.iso8859_2
-- pozdrawiam Rob
Grzegorz Makarewicz - 24-12-2006 00:55
koval wrote: > Czy ktos z Was uzywa cxFreeze na Linuksie ? > Chcialem to 'cos' wyprobowac i napisalem krotki tescik.py : > > # -*- coding: utf-8 -*- > a=u'>> aA \u00f3\u0118\u017B zZ <<' > print type(a),'=',a > b=a.encode('latin2') > print type(b),'=',b > c=b.decode('latin2') > print type(c),'=',c > > interpreter Python'a wykonuje go jak najbardziej OK. > > nastepnie pisze: > FreezePython --install-dir dist tescik.py > wchodze do utworzonego katalogu dist i uruchamiam: > ./tescik > w rezultacie dostaje : > ...../cx_Freeze-3.0.3/initscripts/Console.py", line 27, in ? > exec code in m.__dict__ > File "tescik.py", line 3, in ? > UnicodeEncodeError: 'ascii' codec can't encode characters in position > 6-8: ordinal not in range(128) > > blad w cxFreeze, czy ja cos robie zle ? >
python2.4 xx.py <type 'unicode'> = Traceback (most recent call last): File "xx.py", line 3, in ? print type(a),'=',a UnicodeEncodeError: 'ascii' codec can't encode characters in position 6-8: ordinal not in range(128)
frezujesz jednym pythonem, a wykonujesz pod innym
mak
koval - 24-12-2006 00:55
Grzegorz Makarewicz wrote: > frezujesz jednym pythonem, a wykonujesz pod innym > > mak
nie nadazam , moze troche jasniej ? :) wydawalo mi sie, ze do wykonywania python nie jest juz potrzebny (?) poza tym wszystko dzieje sie na 1 maszynie gdzie jest tylko jedna instalacja pythona (2.4)
koval - 24-12-2006 00:55
Rob Wolfe wrote: > koval napisał(a): > >> blad w cxFreeze, czy ja cos robie zle ? > > Metody encode i decode tak naprawdę korzystają z dodatkowych > modułów w pakiecie encodings (w tym przypadku utf_8 i iso8559_2). > Niestety biedny freeze o tym nie wie, więc dorzuć te importy: > > import encodings.utf_8 > import encodings.iso8859_2 > dziekuje za pomoc , ale nie pomoglo :(
Rob Wolfe - 24-12-2006 00:55
koval napisał(a): > Rob Wolfe wrote: > > koval napisał(a): > > > >> blad w cxFreeze, czy ja cos robie zle ? > > > > Metody encode i decode tak naprawdę korzystają z dodatkowych > > modułów w pakiecie encodings (w tym przypadku utf_8 i iso8559_2). > > Niestety biedny freeze o tym nie wie, więc dorzuć te importy: > > > > import encodings.utf_8 > > import encodings.iso8859_2 > > > dziekuje za pomoc , ale nie pomoglo :(
Masz dokładnie taki sam błąd? W komunikatach freeze'a widać było, że dodaje te moduły?
Dodaj do skryptu: import sys print sys.stdout.encoding print sys.getdefaultencoding()
i pokaż co tam siedzi.
-- pozdrawiam Rob
Rob Wolfe - 24-12-2006 00:55
Rob Wolfe napisał(a): > koval napisał(a): > > Rob Wolfe wrote: > > > koval napisał(a): > > > > > >> blad w cxFreeze, czy ja cos robie zle ? > > > > > > Metody encode i decode tak naprawdę korzystają z dodatkowych > > > modułów w pakiecie encodings (w tym przypadku utf_8 i iso8559_2). > > > Niestety biedny freeze o tym nie wie, więc dorzuć te importy: > > > > > > import encodings.utf_8 > > > import encodings.iso8859_2 > > > > > dziekuje za pomoc , ale nie pomoglo :( > > Masz dokładnie taki sam błąd? > W komunikatach freeze'a widać było, że dodaje te moduły? > > Dodaj do skryptu: > import sys > print sys.stdout.encoding > print sys.getdefaultencoding() > > i pokaż co tam siedzi.
I jeszcze zmodyfikuj swój skrypt w ten sposób:
print type(a),'=', repr(a) b=a.encode('latin2') print type(b),'=', repr(b) c=b.decode('latin2') print type(c),'=', repr(c)
to będziemy mieli pełną jasność.
-- pozdrawiam Rob
Piotr Duda - 24-12-2006 00:55
koval napisał(a): > Czy ktos z Was uzywa cxFreeze na Linuksie ? > Chcialem to 'cos' wyprobowac i napisalem krotki tescik.py : > > # -*- coding: utf-8 -*- > a=u'>> aA \u00f3\u0118\u017B zZ <<' > print type(a),'=',a > b=a.encode('latin2') > print type(b),'=',b > c=b.decode('latin2') > print type(c),'=',c > > interpreter Python'a wykonuje go jak najbardziej OK. > > nastepnie pisze: > FreezePython --install-dir dist tescik.py > wchodze do utworzonego katalogu dist i uruchamiam: > ./tescik > w rezultacie dostaje : > ...../cx_Freeze-3.0.3/initscripts/Console.py", line 27, in ? > exec code in m.__dict__ > File "tescik.py", line 3, in ? > UnicodeEncodeError: 'ascii' codec can't encode characters in position > 6-8: ordinal not in range(128) > > blad w cxFreeze, czy ja cos robie zle ?
Zaznaczam że nie znam się na cxfreeze, ale tu mi wygląda na to że nie jest poprawnie (albo wcale) ustawione kodowanie stdout. Wrzuć na początek skryptu coś takiego: Kod:
import sys print sys.stdout.encoding
Jeśli rzuci wyjątek to znaczy że kodowanie nie jest ustawione, jeśli wypisze "ascii" to znaczy że kodowanie jest ustawione na ascii.
W obu przypadkach doraźnym rozwiązaniem może być ustawienie sys.stdout.encoding na kodowanie które masz na konsoli (to co podałem wcześniej wypisze to kodowanie jeśli uruchomisz za pomocą interpretera pythona) .
-- Piotr Duda "Inochi wa sutete mo Otoko wo suteru ki wa nakatta wai!"
koval - 24-12-2006 00:55
OK, tescik.py wyglada teraz tak:
# -*- coding: utf-8 -*-
import encodings.utf_8 import encodings.iso8859_2 import sys
print "stdout.encodifg=",sys.stdout.encoding print "getdefaultencoding=",sys.getdefaultencoding()
a=u'>> aA \u00f3\u0118\u017B zZ <<'
print type(a),'=', repr(a) b=a.encode('latin2') print type(b),'=', repr(b) c=b.decode('latin2') print type(c),'=', repr(c)
Uruchomienie z interpretera daje : stdout.encodifg= ISO-8859-2 getdefaultencoding= ascii <type 'unicode'> = u'>> aA \xf3\u0118\u017b zZ <<' <type 'str'> = '>> aA \xf3\xca\xaf zZ <<' <type 'unicode'> = u'>> aA \xf3\u0118\u017b zZ <<'
Uruchomienie po "zfreezowaniu" daje: stdout.encodifg= None getdefaultencoding= ascii <type 'unicode'> = u'>> aA \xf3\u0118\u017b zZ <<' <type 'str'> = '>> aA \xf3\xca\xaf zZ <<' <type 'unicode'> = u'>> aA \xf3\u0118\u017b zZ <<'
ciekawe, prawda ?
Grzegorz Makarewicz - 24-12-2006 00:55
koval wrote: > Grzegorz Makarewicz wrote: >> frezujesz jednym pythonem, a wykonujesz pod innym >> >> mak > > nie nadazam , moze troche jasniej ? :) > wydawalo mi sie, ze do wykonywania python nie jest juz potrzebny (?) > poza tym wszystko dzieje sie na 1 maszynie gdzie jest tylko jedna > instalacja pythona (2.4) >
Ten pierwszy wiersz ( # -*- coding: utf-8 -*-) jest rozpoznawany przez interpreter pythona, wtedy na potrzebe skryptu jest robionych troche zmian, freeze pewno o nim zapomnialo.
Jak odpalilem Twoj skrypt w py2.4 na konsoli bez ustawionego locale - to wlasnie sie wykrzaczyl na pokazaniu "print type(a),'=',a", a szczegolnie wartosci a. Czyli sys.stdout.encoding == ascii, a nie utf-8
mak
Rob Wolfe - 24-12-2006 00:55
koval <koval@USUN_TOkonto.pl> writes:
> ciekawe, prawda ?
Arcyciekawe. :) Sytuacja jest nieco złożona. Domyślnie kodowanie ustawiane jest na "ascii", co pokazuje sys.getdefaultencoding(). Zmienić je można w module site.py lub sitecustomize.py, które ładowane są zawsze przy odpalaniu skryptów przy pomocy interpretera. W przypadku freeze musimy to kodowanie ustawić samodzielnie w skrypcie. A trzeba to zrobić tak:
try: sys.setdefaultencoding("iso-8859-2") # kodowanie w systemie except AttributeError: pass
Gdy skrypt będzie odpalany przez interpreter, to wyskoczy wyjątek, ponieważ w module site.py metoda setdefaultencoding jest usuwana. Dlatego trzeba to obudować.
Po zamrożeniu moduł sys będzie nadal posiadał metodę setdefaultencoding, bo site.py nie będzie ładowane i dzięki temu możemy ustawić kodowanie.
-- pozdrawiam Rob
koval - 24-12-2006 00:55
Rob Wolfe wrote: > A trzeba to zrobić tak: > > try: > sys.setdefaultencoding("iso-8859-2") # kodowanie w systemie > except AttributeError: > pass > BINGO!!
I to jest to! Wielkie dzieki, klaniam sie nisko :))
pozdrawiam, Grzegorz
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
MS SQL unicode i funkcja replace()
Jak wyswietlic numer UNICODE podanego stringa?
[Oracle9] - Dane w UNICODE (cyrylica)
txt unicode -> jpg
RGB -> YCrCb -> RGB
[MySql] prosta statystyka dzienna
baza danych *.sg
specyficzny top-ten
pierwszy lay ;]
ostrzezenie o zabezpieczeniach
zanotowane.pldoc.pisz.plpdf.pisz.plmarcelq.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|