Problem mit py2exe und encodings

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
makro
User
Beiträge: 25
Registriert: Sonntag 12. Juli 2009, 08:53

hallo,

ich habe ein problem mit py2exe und den encodings..mein programm läuft unter der eclipse-umgebung ohne probleme.
ich habe mir eine "DebugPrint" Funktion gemacht, die mir auf der konsole daten ausgibt.
sobald ich aber dieses mit py2exe zu einer ausführbaren-datei kompiliere kommt es zur folgenden meldung:
UnicodeDeodeError: 'ascii' codec can´t decode byte 0xf6 in position...

ich habe in allen *.py dateien in der ersten zeile stehen:
# -*- coding: Cp1252 -*-

die DebugPrint-Funktion sieht folgendermaßen aus:

Code: Alles auswählen

def DebugPrint(*args, **kargs):

    if(DEBUG):
        import sys
               for __arg in args:
            print str(__arg).encode('latin-1','ignore');
ich habe auch py2exe in den options packages: ["encodings"] mit angegeben...

habe auch schon andere codings in DebugPrint angegeben..geht aber auch nicht!! es kommt immer oben zu der oberen Fehlermeldung!

Kann mir jemand weiterhelfen, an was das noch liegen könnte??
Ich weiß leider nicht mehr weiter..

mfg

Edit (BlackJack): Quelltext in Code-Tags gesetzt.
BlackJack

@makro: Es ist Unsinn `encode()` auf einem `str`-Objekt aufzurufen. Das wird dann nämlich implizit wieder in ein Unicode-Objekt umgewandelt, damit *darauf* dann `encode()` aufgerufen werden kann. Und diese implizite Umwandlung geschieht mit der ASCII-Kodierung und löst eine Ausnahme aus, wenn da etwas ausserhalb von ASCII drin vorkommt.

Zur Fehlersuche ist vielleicht die `repr()`-Ausgabe von Objekten sowieso nützlicher als die `str()`-Ausgabe.
makro
User
Beiträge: 25
Registriert: Sonntag 12. Juli 2009, 08:53

achso!..ok, dann werd ich das mal umändern..

habe aber gerade auch noch folgendes versucht...
ich habe folgende print-Ausgabe "print unicode("äää") eingeführt und dabei kommt es zu dergleichen Fehlermeldung...wie kann das sein??

wie gesagt, unter eclipse gehts..
BlackJack

@makro: Woher soll `unicode()` wissen was es mit Werten ausserhalb von ASCII anfangen soll!? Der Coding-Kommentar ist für den Compiler und literale Unicode-Zeichenketten.

Edit: Eclipse ist kein Massstab, da verhalten sich Python-Programme in mehr als diesem Punkt anders als in "normalen" Umgebungen. Du solltest immer auch testen wie das Programm in der Umgebung funktioniert, in der es später auch laufen wird. Kaum jemand wird Eclipse starten um dann von dort aus Python-Programme zu starten. ;-)

Der Rat ist IMHO auch unabhängig von der IDE.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Wenn du in einem Dosfenster unter Windows etwas ausgibst hast du nicht latin-1 sondern eine Codepage. Bei uns meistens Codepage 850.
makro
User
Beiträge: 25
Registriert: Sonntag 12. Juli 2009, 08:53

ja, ist schon richtig mit eclipse! deswegen versuch ich ja mit py2exe eine ausführbare datei zu erstellen...
das mit DebugPrint sollte mir nur eine hilfe sein, damit ich sehe, was da in den Strings drin steht...weil mein eigentliches problem ist, wenn
ich nun zwei strings vergleiche..und zwar jetzt so:

s1 = unicode(name,'cp1252','ignore')
s2 = unicode(name2,'cp1252','ignore')

if(s1 == s2):
...
kommt es bei der exe-datei in der automatisch-generierten log-datei zu dem eintrag: TypeError: decoding Unicode is not supported

davor war if(name == name2):...da kam es zum UnicodeDecodeError...

die exe ist eine windows-Anwendung, keine console
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Wie öffnest und erstellst du die Logdatei?
makro
User
Beiträge: 25
Registriert: Sonntag 12. Juli 2009, 08:53

ich erstelle die datei nicht selber!
sobald in der exe-datei eine exception auftritt, wird automatisch eine logdatei angelegt und da steht dann drin, wo und was passiert ist..

py2exe konfiguriere ich so in einer setup.py:

setup(options = {"py2exe": {
"includes": ["win32com.client","excellib"],
"packages": ["encodings"],
"bundle_files": 2,
"optimize": 0,

}},


windows=['TestApp.py'])

erstellt wird dann die exe über die Kommandozeile: python setup.py py2exe
BlackJack

@makro: Die Ausnahme bekommt man von `unicode()` wenn das übergebene Objekt schon ein `unicode`-Exemplar ist und man trotzdem eine Kodierung angibt. Das ist ja auch sinnlos. Du solltest Dir vielleicht nochmal über den Unterschied zwischen Unicode-Objekten und `str`-"Zeichen"ketten klar werden und was Du an welcher Stelle im Programmfluss jeweils an die Namen gebunden hast. `name` oder `name2` (oder beide) sind anscheinend bereits `unicode`-Exemplare und keine `str`-Exemplare.

Bei den unnötigen Klammern um die Bedingungen und dem Semikolon im ersten Beitrag vielleicht auch noch einmal der Hinweis: Versuche in Python zu Programmieren und zu denken, und nicht eine andere Sprache und ihre Idiome in Python-Syntax zu pressen.

Was sollen im ersten Beitrag bei `__arg` eigentlich die beiden führenden Unterstriche?

Edit: Und Du könntest für Deine Quelltextschnippsel bitte mal Code-Tags benutzen. Das ist dann deutlich lesbarer.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Wenn du natürlich schon Unicode hast brauchst du 'decode', um es in etwas anderes umzuwandeln. Vielleicht hilft das weiter: http://www.amk.ca/python/howto/unicode
dahaze
User
Beiträge: 75
Registriert: Freitag 13. März 2009, 10:57
Wohnort: im Schwabenland

mkesper hat geschrieben:Wenn du natürlich schon Unicode hast brauchst du 'decode', um es in etwas anderes umzuwandeln.
imho genau umgekehrt, da Unicode eben kein Encoding ist!

Deshalb z.B.:
utf-8 -> decode('utf8') => unicode
unicode -> encode('ISO-8859-1') => ISO-8859-1

Siehe auch [wiki=Von Umlauten, Unicode und Encodings]Wikilink[/wiki]

Gruß,
Simon
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

@dahaze: du hast Recht. Habe mich erfolgreich verwirren lassen. :shock:
Antworten