Seite 1 von 2

pyinstaller, cx_freeze unicode???

Verfasst: Samstag 24. Juni 2006, 20:07
von DatenMetzgerX
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

Verfasst: Samstag 24. Juni 2006, 20:33
von gerold
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
:-)

Verfasst: Samstag 24. Juni 2006, 21:55
von DatenMetzgerX
Das ist doch für eine Kommandozeilen Programm?

Ist aber ein wxPython Programm

Verfasst: Sonntag 25. Juni 2006, 07:59
von gerold
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.

Verfasst: Sonntag 25. Juni 2006, 09:47
von DatenMetzgerX
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)

Verfasst: Sonntag 25. Juni 2006, 10:01
von Python 47
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).

Verfasst: Sonntag 25. Juni 2006, 10:10
von DatenMetzgerX
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)

Verfasst: Sonntag 25. Juni 2006, 11:01
von gerold
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
:-)

Verfasst: Sonntag 25. Juni 2006, 11:10
von gerold
...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
:-)

Verfasst: Sonntag 25. Juni 2006, 11:11
von Python 47
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:

Verfasst: Sonntag 25. Juni 2006, 11:16
von gerold
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
:-)

Verfasst: Sonntag 25. Juni 2006, 11:29
von Python 47
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.

Verfasst: Sonntag 25. Juni 2006, 12:10
von DatenMetzgerX
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

Verfasst: Sonntag 25. Juni 2006, 12:33
von gerold
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
:-)

Verfasst: Sonntag 25. Juni 2006, 13:36
von DatenMetzgerX
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__)

Re: pyinstaller, cx_freeze unicode???

Verfasst: Sonntag 25. Juni 2006, 14:03
von 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.

Verfasst: Montag 26. Juni 2006, 08:40
von gerold
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
:-)

Verfasst: Montag 26. Juni 2006, 19:36
von DatenMetzgerX
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 :(

Verfasst: Montag 26. Juni 2006, 22:09
von Python 47
Es wäre vielleicht hiflreich, wenn du den ganzen oder einen größeren Teil des Codes schicken würdest. :)

Verfasst: Montag 26. Juni 2006, 22:43
von DatenMetzgerX

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")