pyinstaller, cx_freeze unicode???

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.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Hallo
Wenn ich mein Programm auf Linux laufen lasse (ohne zu freezen), geht alles wunderbar.

Sobald ich es aber mit einen der oben gennanten Programmen freeze, gibt es Probleme. Und zwar reklamiert er wegen Umlauten

Code: Alles auswählen

        for root, dir, files in os.walk(self.Folder):
            for file in files:
                if resize.isPicture(os.path.splitext(file)[-1], wildcard):
                    lCounter+=1L
Auf der ersten Zeile soll der Fehler liegen :o
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi DatenMetzgerX!

Nur mal so zum Ausprobieren. Hilft es, wenn du diesen Code ganz oben rein gibst?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import sys
import codecs

# Encodings herausfinden
out_enc = sys.stdout.encoding or sys.getfilesystemencoding()
err_enc = sys.stderr.encoding or sys.getfilesystemencoding()
try: 
    in_enc = sys.stdin.encoding
except: 
    in_enc = sys.getfilesystemencoding()

# StdOut und StdErr umleiten -> Streamwriter mit korrektem Encoding
# (!!!funktioniert so nicht im IDLE!!!)
sys.stdout = codecs.getwriter(out_enc)(sys.__stdout__)
sys.stderr = codecs.getwriter(out_enc)(sys.__stderr__)
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Das ist doch für eine Kommandozeilen Programm?

Ist aber ein wxPython Programm
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

DatenMetzgerX hat geschrieben:Das ist doch für eine Kommandozeilen Programm?
Probier es bitte trotzdem aus. Es leitet ja auch STDIN um. Mein Gedanke war: Vielleicht beeinflusst es indirekt "os.walk"? Der Zweite Gedanke: Vielleicht genügt es ja schon, wenn das Modul "codecs" importiert wird.

PS: Traceback bitte.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Nach dem einfügen der oben gennanten Zeilen

Code: Alles auswählen

micha@micha-desktop:~/pyinstaller$ /home/micha/pyinstaller/main/distmain/main
Traceback (most recent call last):
  File "<string>", line 23, in ?
  File "./main/buildmain/out1.pyz/codecs", line 752, in getwriter
TypeError: lookup() argument 1 must be string, not None
Vorher

Code: Alles auswählen

Exception in thread Thread-1:
Traceback (most recent call last):
  File "./main/buildmain/out1.pyz/threading", line 442, in __bootstrap
  File "./main/buildmain/out1.pyz/frmfolder", line 32, in run
  File "./main/buildmain/out1.pyz/os", line 291, in walk
  File "./main/buildmain/out1.pyz/os", line 291, in walk
  File "./main/buildmain/out1.pyz/os", line 281, in walk
  File "./main/buildmain/out1.pyz/posixpath", line 65, in join
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Hallo Micha,

so wie ich das sehe, hat sich dein Problem mit Umlauten, mit dem Code von Gerold gelöst, allerdings hast du einen Fehler in deinem Programm. Du musst der Funktion lookup einen String als erstes Argument übergeben. Du hast einen anderen Typ übergeben(None).
mfg

Thomas :-)
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Habe das Ganze 1:1 kopiert...

Wenn ich es in Python laufen lasse, funktioniert alles.
Sobald ich es mit pyinstaller Freeze, läuft wieder nichts mehr (Traceback oben)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

DatenMetzgerX hat geschrieben:Sobald ich es mit pyinstaller Freeze, läuft wieder nichts mehr
Hi DatenMetzgerX!

Ich habe ein wenig experimentiert. Probiere mal diesen Code aus:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import sys
import encodings
import encodings.ascii
import encodings.utf_8
import encodings.iso8859_1
import encodings.iso8859_15
import encodings.mbcs
import encodings.cp850
import codecs

 
# Encodings herausfinden
out_enc = sys.stdout.encoding or sys.getfilesystemencoding()
print out_enc
err_enc = sys.stderr.encoding or sys.getfilesystemencoding()
print err_enc

try: 
    in_enc = sys.stdin.encoding
except: 
    in_enc = sys.getfilesystemencoding()

# StdOut und StdErr umleiten -> Streamwriter mit korrektem Encoding
# (!!!funktioniert so nicht im IDLE!!!)
sys.stdout = codecs.getwriter(out_enc)(sys.__stdout__)
sys.stderr = codecs.getwriter(out_enc)(sys.__stderr__)
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

...oder auch so:

Code: Alles auswählen

import encodings.cp037, encodings.cp1006, encodings.cp1026, encodings.cp1140, \
       encodings.cp1250, encodings.cp1251, encodings.cp1252, encodings.cp1253, \
       encodings.cp1254, encodings.cp1255, encodings.cp1256, encodings.cp1257, \
       encodings.cp1258, encodings.cp424, encodings.cp437, encodings.cp500, \
       encodings.cp737, encodings.cp775, encodings.cp850, \
       encodings.cp852, encodings.cp855, encodings.cp856, \
       encodings.cp857, encodings.cp860, encodings.cp861, \
       encodings.cp862, encodings.cp863, encodings.cp864, \
       encodings.cp865, encodings.cp866, encodings.cp869, \
       encodings.cp874, encodings.cp875, encodings.idna, \
       encodings.iso8859_10, encodings.iso8859_13, encodings.iso8859_14, \
       encodings.iso8859_15, encodings.iso8859_1, encodings.iso8859_2, \
       encodings.iso8859_3, encodings.iso8859_4, encodings.iso8859_5, \
       encodings.iso8859_6, encodings.iso8859_7, encodings.iso8859_8, \
       encodings.iso8859_9, encodings.koi8_r, encodings.koi8_u, \
       encodings.latin_1, encodings.mac_cyrillic, encodings.mac_greek, \
       encodings.mac_iceland, encodings.mac_latin2, encodings.mac_roman, \
       encodings.mac_turkish, encodings.mbcs, encodings.palmos, \
       encodings.punycode, encodings.quopri_codec, encodings.utf_8
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

gerold hat geschrieben:...oder auch so:

Code: Alles auswählen

import encodings.cp037, encodings.cp1006, encodings.cp1026, encodings.cp1140, \
       encodings.cp1250, encodings.cp1251, encodings.cp1252, encodings.cp1253, \
       encodings.cp1254, encodings.cp1255, encodings.cp1256, encodings.cp1257, \
       encodings.cp1258, encodings.cp424, encodings.cp437, encodings.cp500, \
       encodings.cp737, encodings.cp775, encodings.cp850, \
       encodings.cp852, encodings.cp855, encodings.cp856, \
       encodings.cp857, encodings.cp860, encodings.cp861, \
       encodings.cp862, encodings.cp863, encodings.cp864, \
       encodings.cp865, encodings.cp866, encodings.cp869, \
       encodings.cp874, encodings.cp875, encodings.idna, \
       encodings.iso8859_10, encodings.iso8859_13, encodings.iso8859_14, \
       encodings.iso8859_15, encodings.iso8859_1, encodings.iso8859_2, \
       encodings.iso8859_3, encodings.iso8859_4, encodings.iso8859_5, \
       encodings.iso8859_6, encodings.iso8859_7, encodings.iso8859_8, \
       encodings.iso8859_9, encodings.koi8_r, encodings.koi8_u, \
       encodings.latin_1, encodings.mac_cyrillic, encodings.mac_greek, \
       encodings.mac_iceland, encodings.mac_latin2, encodings.mac_roman, \
       encodings.mac_turkish, encodings.mbcs, encodings.palmos, \
       encodings.punycode, encodings.quopri_codec, encodings.utf_8
lg
Gerold
:-)
Das sieht aber nicht mehr wirklich schön aus. :shock:
mfg

Thomas :-)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Python Master 47 hat geschrieben:Das sieht aber nicht mehr wirklich schön aus. :shock:
Funktioniert es???

Es geht ja nur darum, dass die benötigten Encodings evt. importiert werden müssen, bevor sie in cxFreeze und/oder py2exe verwendet werden können.

Wenn es funktioniert, dann wissen wir woran wir sind. Du kannst dann ja immer noch auf die notwendigsten Encodings abspecken.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Hi Gerold,

ich wollt ja nur damit sagen, das ich dein 1. Beispiel nehmen würde. Denn in einem Programmcode würde es um einiges besser aussehen als das 2. Beispiel. Aber im Grunde hast du recht.
mfg

Thomas :-)
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Funktioniert beides nicht.

Das ganze versuche ich auf Ubuntu mit pyinstaller.

Wenn ich das ganze mit py2exe freeze, läuft es nachher bestens (nicht auf linux)

Code: Alles auswählen

Exception in thread Thread-1:
Traceback (most recent call last):
  File "./main/buildmain/out1.pyz/threading", line 442, in __bootstrap
  File "./main/buildmain/out1.pyz/frmfolder", line 50, in run
  File "./main/buildmain/out1.pyz/os", line 291, in walk
  File "./main/buildmain/out1.pyz/os", line 291, in walk
  File "./main/buildmain/out1.pyz/os", line 281, in walk
  File "./main/buildmain/out1.pyz/posixpath", line 65, in join
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)
Line 50 immer noch die gleiche wie am anfang
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

DatenMetzgerX hat geschrieben:Wenn ich das ganze mit py2exe freeze, läuft es nachher bestens (nicht auf linux)
Hi DatenMetzgerX!

Ich habe meine Tests nur mit cx_freeze und nur mit dem Code aus diesem Beitrag http://www.python-forum.de/post-39112.html#39112 durchgeführt. cx_freeze hat sich einiges von py2exe und pyinstaller abgeschaut. Vielleicht läuft es mit cx_freeze unter Windows und Linux korrekt.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

hmm geht nicht.

Genau den Code von oben genomme. Gefreezt

Code: Alles auswählen

micha@micha-desktop:~/Desktop/cx_Freeze-3.0.2/image$ python ../FreezePython.py "../../test.py"
und dann ausgeführt, selber Fehler wie vorher

Code: Alles auswählen

micha@micha-desktop:~/Desktop/cx_Freeze-3.0.2/image$ ./test
None
None
Traceback (most recent call last):
  File "/home/micha/Desktop/cx_Freeze-3.0.2/initscripts/Console.py", line 26, in ?
    exec code in m.__dict__
  File "../../test.py", line 24, in ?
    sys.stdout = codecs.getwriter(out_enc)(sys.__stdout__)
  File "/usr/lib/python2.4/codecs.py", line 752, in getwriter
    return lookup(encoding)[3]
TypeError: lookup() argument 1 must be string, not None

Code: Alles auswählen

import sys
import encodings
import encodings.ascii
import encodings.utf_8
import encodings.iso8859_1
import encodings.iso8859_15
import encodings.latin_1
import encodings.cp850
import codecs

# Encodings herausfinden
out_enc = sys.stdout.encoding or sys.getfilesystemencoding()
print out_enc
err_enc = sys.stderr.encoding or sys.getfilesystemencoding()
print err_enc

try:
    in_enc = sys.stdin.encoding
except:
    in_enc = sys.getfilesystemencoding()

# StdOut und StdErr umleiten -> Streamwriter mit korrektem Encoding
# (!!!funktioniert so nicht im IDLE!!!)
sys.stdout = codecs.getwriter(out_enc)(sys.__stdout__)
sys.stderr = codecs.getwriter(out_enc)(sys.__stderr__)
BlackJack

DatenMetzgerX hat geschrieben:

Code: Alles auswählen

        for root, dir, files in os.walk(self.Folder):
            for file in files:
                if resize.isPicture(os.path.splitext(file)[-1], wildcard):
                    lCounter+=1L
Hat nichts mit Deinem Problem zu tun, aber man sollte keine Namen von eingebauten Funktionen/Typen, in diesem Fall `file`, verdecken.

Und dann ist das L bei der 1 überflüssig es sei denn Du arbeitest mit einer *sehr* alten Python-Version.

Zur Namensgebung selbst: Der Styleguide empfiehlt Grossschreibung und CamelCase nur für Klassennamen. Und das `l` vor `Counter` scheint diese hässliche ungarische Notation zu sein. Das es sich bei `Counter` um eine Zahl handelt sollte auch ohne `l` ersichtlich sein.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

DatenMetzgerX hat geschrieben:

Code: Alles auswählen

micha@micha-desktop:~/Desktop/cx_Freeze-3.0.2/image$ ./test
None
None
Hi DatenMetzgerX!

So wie es aussieht, ist das Problem, dass das Python-Programm, wenn es unter Linux gefreezed wurde, das Encoding von STDIN und STDOUT nicht herausfinden kann. Man erkennt das an den "None", die du im Beispiel zurück bekommen hast.

Wenn du statt diesem Code

Code: Alles auswählen

# Encodings herausfinden
out_enc = sys.stdout.encoding or sys.getfilesystemencoding()
print out_enc
err_enc = sys.stderr.encoding or sys.getfilesystemencoding()
print err_enc
das Encoding manuell angibst -- funktioniert es dann?

Code: Alles auswählen

# Encodings herausfinden
out_enc = "utf-8"
print out_enc
err_enc = "utf-8"
print err_enc
Wenn Ja, dann müssten wir nur noch herausbekommen, wie wir das Encoding direkt abfragen können. Mir schwebt da z.B. vor, dass man die Ausgabe von "locale" untersuchen könnte.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

So hatte Zeit zum Testen

Code: Alles auswählen

Exception in thread Thread-1:
Traceback (most recent call last):
  File "./main/buildmain/out1.pyz/threading", line 442, in __bootstrap
  File "./main/buildmain/out1.pyz/frmfolder", line 32, in run
  File "./main/buildmain/out1.pyz/os", line 291, in walk
  File "./main/buildmain/out1.pyz/os", line 291, in walk
  File "./main/buildmain/out1.pyz/os", line 281, in walk
  File "./main/buildmain/out1.pyz/posixpath", line 65, in join
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)
Selber Fehler wei am Anfang :(
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Es wäre vielleicht hiflreich, wenn du den ganzen oder einen größeren Teil des Codes schicken würdest. :)
mfg

Thomas :-)
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Code: Alles auswählen

def Generate(self, event):
        """Verkleinert die eigentlichen Bilder"""
        
        if not resize.isEmpty(self.txtFolder.GetValue()) and not ( resize.isEmpty(self.txtHeight.GetValue()) and resize.isEmpty(self.txtWidth.GetValue()) and not resize.isEmpty(self.txtDestination.GetValue()) ):
            self.Enable(False)
            maximum = count(self.txtFolder.GetValue(), self)
            progress = wx.ProgressDialog("Status", u"Dateien werden gezählt", maximum,parent = self, style = wx.PD_AUTO_HIDE | wx.PD_CAN_ABORT | wx.PD_ELAPSED_TIME | wx.PD_REMAINING_TIME)
            #self.Status.Destroy()
            progress.Update(0, "Dateien werde umgeformt")
            wildcard = (".jpg", ".png", ".jpeg", ".gif", ".bmp")
            
            if resize.isEmpty(self.txtHeight.GetValue()):
                height = 0
                width = int(self.txtWidth.GetValue())
            elif resize.isEmpty(self.txtWidth.GetValue()):
                width = 0
                height = int(self.txtHeight.GetValue())
            else:
                height = int(self.txtHeight.GetValue())
                width = int(self.txtWidth.GetValue())
            
            lCounter = 0
            exit = True
            for dir, dirs, files in os.walk(self.txtFolder.GetValue()):
                subdir = string.split(dir, self.txtFolder.GetValue())[-1]
                for file in files:
                    if progress.Update(lCounter, file)==False:
                       exit = False
                       break
                    type = os.path.splitext(file)[-1]
                    #type = string.rsplit(file, ".", 1)[-1]
                    if resize.isPicture(type, wildcard):
                        if subdir:
                            #destination = self.txtDestination.GetValue() + subdir
                            destination = os.path.join(self.txtDestination.GetValue(), subdir)
                        else:
                            destination = self.txtDestination.GetValue()
                        if os.path.exists(destination) == False:
                            try:
                                os.makedirs(destination)
                            except IOError, ex:
                                resize.PrintError(self, str(ex))
                        
                        if not resize.isEmpty(self.txtPrefix.GetValue()):
                            filedest = self.txtPrefix.GetValue() + file
                        else:
                            filedest = file
                            
                        resize.resize(os.path.join(dir, file), os.path.join(destination, filedest), height, width)
                        lCounter+=1
                        progress.Update(lCounter)
                if exit == False:
                    break
            #self.Status2.Destroy()
            if exit == True:
                resize.PrintInformation(self, u"Grösse erfolgreich geändert", "Fertig")
            else:
                progress.Destroy()
                resize.PrintError(self, u"Abbruch durch den Benutzer")
            self.Enable(True)
        else:
            resize.PrintError(self, "Bitte alle Felder ausfüllen")
Antworten