FreezePython - Import Error - Unknown Encoding

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
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hallo liebe Pythonfans!

Leider habe ich ein Problem, bei dem ich nicht weiter weiß:
Ich habe ein Script namens "SCL_UTF8_TO_ANSI.py":

Code: Alles auswählen

#!/Python24/python.exe
# -*- coding: iso-8859-1 -*-
# File: SCL_UTF8_TO_ANSI.py
import os

def main():
    path = path = os.getcwd() + '\\'
    filepath_utf8 = path + 'UTF8.xml'
    
    print filepath_utf8
    
    pos = filepath_utf8.find('.')
    filepath_ansi = filepath_utf8[:pos] + '_ansi' + filepath_utf8[pos:]
    
    file_utf8 = file(filepath_utf8, 'r')
    code_utf8 = file_utf8.read()
    code_ansi = code_utf8.decode('utf-8').encode('iso-8859-1')
    
    file_ansi = file(filepath_ansi, 'w')
    file_ansi.write(code_ansi)
    file_utf8.close()
    file_ansi.close()
#-----------------------------------------------------
if __name__ == '__main__':
    main()
Im selben Verzeichnis liegt eine UTF-8 codierte Textdatei namens "UTF8.xml"

Das obige Skript funktioniert wunderbar. Es legt die Datei "UTF8.xml" als "UTF8_ansi.xml" in ANSI-Kodierung ins selbe Verzeichnis.

Nun zu meinem Problem:
Ich benötige eine ausführbare *.exe-Datei. Hierfür verwende ich (bisher immer erfolgreich) FreezePython. Ich habe mir ein kleines Skript geschrieben, mit welchem ich FreezePython aufrufe, damit es mir aus dem obigen Skript "SCL_UTF8_TO_ANSI.py" eine "SCL_UTF8_TO_ANSI.exe" erstellt:

Code: Alles auswählen

#!/Python24/python.exe
# -*- coding: iso-8859-1 -*-
# File: setup_erstellen.py
import os
import subprocess
import sys

CWD = os.getcwd()
PATH = CWD + '\\'
SCRIPTNAME  = 'SCL_UTF8_TO_ANSI.py'                    # name of main script file to compile with Freeze
SCRIPTPATH = PATH + SCRIPTNAME
EXENAME = 'SCL_UTF8_TO_ANSI.exe'
#-----------------------------------------------------   
class Installer:
    def __init__(self):        
        self.compile()
    #----------------------------------------------------- 
    def compile(self):  
        # compile python script
        if os.path.isfile(SCRIPTPATH):
            cmd = 'FreezePython -c --install-dir=%s --base-name=Console.exe --target-name=%s %s'%(
            PATH, EXENAME, SCRIPTPATH)
            
            print cmd
            
            p = subprocess.Popen(cmd, shell = True) 
            result = p.wait()
            success = not result
            if not success:
                raw_input('Fehler:\nFreezePython konnte\n"%s"\nnicht kompilieren!\nFehlercode: %d%s'%(result, success, ErrMsg))
                return -1
#-----------------------------------------------------
if __name__ == '__main__':
    Installer()
Die "SCL_UTF8_TO_ANSI.exe" landet ebenfalls im selben Verzeichnis. Wenn ich sie nun aber ausführe, erhalte ich eine Fehlermeldung. Siehe http://allyoucanupload.webshots.com/v/2 ... 6594183887

Versionen:
Python: 2.5.1
FreezePython: 3.0.3

Vielleicht hat ja jemand eine Idee?

Viele Grüße
JR
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

cxfreeze hat das Problem, daß es die Encodings nicht automatisch mit einfriert, wenn du sie nicht explizit importierst. Such mal hier im Forum, Gerold(?) hatte vor einiger Zeit mal was zum Thema Unicode geschrieben, wo er am Anfang des Moduls diese ganzen Importe durchführt (Tut mir leid, hab grad keine Zeit zum Suchen).
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Ok, ich hab natürlich doch gesucht:

http://www.python-forum.de/topic-6539.h ... ht=unicode
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi, danke, habe ich auch schon gefunden... :-)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!

Man kann diese Imports auch in den "initscripts" unterbringen. Dann muss man sich im eigenen Programm nicht mehr darum kümmern.

Einfach z.B. in *initscripts\Console.py*

Code: Alles auswählen

import encodings
durch

Code: Alles auswählen

import encodings, encodings.ascii, encodings.utf_8, \
    encodings.iso8859_1, encodings.iso8859_15
try:
    import encodings.mbcs, encodings.cp850
except:
    pass 
ersetzen. Damit sollte cx_freeze diese Module automatisch mit dazupacken. Aber ich habe es noch nicht ausprobiert.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi!

Also leider klappt das nicht.

Ich habe das Skript mal geändert:

Code: Alles auswählen

#!/Python24/python.exe
# -*- coding: iso-8859-1 -*-
# File: SCL_UTF8_TO_ANSI.py
import os
import codecs 

path = path = os.getcwd() + '\\'
filepath_utf8 = path + 'UTF8.xml'

print filepath_utf8

pos = filepath_utf8.find('.')
filepath_ansi = filepath_utf8[:pos] + '_ansi' + filepath_utf8[pos:]

file_utf8 = codecs.open(filepath_utf8, 'r', 'utf-8')
code_utf8 = file_utf8.read()
code_ansi = code_utf8[:]

file_ansi = codecs.open(filepath_ansi, 'w', 'iso-8859-1')

file_ansi.write(code_ansi)
file_utf8.close()
file_ansi.close()
Es funktioniert auch. Die Console.py (bei mir) unter C:\Python25\cx_Freeze-3.0.3\initscripts habe ich angepasst. Wenn ich dann die generierte EXE ausführe, wird zwar eine Datei "UTF8_ansi.xml" erstellt, doch sie ist leer. Es wird nichts reingeschrieben.
Wie gesagt, wenn ich das Skript *.py ausführe, klappt es wunderbar.

Ich hasse Probleme mit Kodierungen Arghhhh-... :-)

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

Hallo JR!

Ich habe jetzt einen Test gemacht. Dafür habe ich in allen Python-Dateien des Ordners *initscripts* die Imports

Code: Alles auswählen

import encodings, encodings.ascii, encodings.utf_8, \
    encodings.iso8859_1, encodings.iso8859_15
try:
    import encodings.mbcs, encodings.cp850
except:
    pass
hinzugefügt. Auch wenn in der Datei kein ``import encodings`` enthalten ist. -- Nur zur Sicherheit. Denn nur ``import encodings`` alleine hilft nicht.

Dann habe ich einen Testordner erstellt. In diesem habe ich die Datei "utf8_to_iso88591.py" erstellt und mit diesem Code befüllt:

Code: Alles auswählen

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

import sys


def utf8_to_iso88591(source_filename, dest_filename):
    f_source = file(source_filename, "rb")
    f_dest = file(dest_filename, "wb")
    f_dest.write(f_source.read().decode("utf-8").encode("iso-8859-15"))
    f_dest.close()
    f_source.close()


def main():
    if len(sys.argv) == 3:
        source_filename = sys.argv[1]
        dest_filename = sys.argv[2]
        utf8_to_iso88591(source_filename, dest_filename)
    else:
        print "No Filenames"


if __name__ == "__main__":
    main()
Dann erstellte ich noch eine Textdatei mit dem Namen "hallowelt_utf8.txt" und diesem Inhalt:

Code: Alles auswählen

Über den Wolken von Österreich!
Das machte ich mit dem Programm "MadEdit", in dem man dann auch das Encoding angeben kann. Du kannst das auch mit "notepad.exe" erledigen. Beim Speichern hast du die Möglichkeit, als Encoding "utf-8" anzugeben.

Anschließend erstellte ich die CMD-Datei "make_exe_win.cmd" mit diesem Code:

Code: Alles auswählen

REM  --------------------------------------------------
REM   Erstellt aus dem PYTHONFILE eine ausführbare EXE
REM  --------------------------------------------------

SET PROJECTDIR="J:\Ablage\cxfreezetest"
SET PYTHONFILE="utf8_to_iso88591.py"

CD /D %PROJECTDIR%

RD /S /Q dist
MD dist
MD dist\win

CP %SystemRoot%\system32\msvcr71.dll dist\win\

FreezePython.exe --install-dir=dist\win --base-name=Console.exe %PYTHONFILE%

PAUSE
So, alles ist jetzt vorbereitet. Ein Doppelklick auf die CMD-Datei erstellt den Unterordner "dist\win" und gibt dort alles rein, was zum Ausführen des Programmes benötigt wird.

Zum Testen habe ich den Ordner "win" irgendwo anders hin kopiert und umbenannt. Der Kommandozeilenaufruf ``utf8_to_iso88591.exe hallowelt_utf8.txt hallowelt_iso.txt`` hatte als Ergebnis eine neue Textdatei in der Codierung iso-8859-15. Ich konnte also keinen Fehler feststellen.

Ich werde jetzt ein Windows ohne Python in einer Virtuellen Konsole starten und dort das Programm ausprobieren.

mfg
Gerold
:-)

EDIT: codecs-Modul aus dem Code gestrichen
Zuletzt geändert von gerold am Donnerstag 7. Februar 2008, 14:06, insgesamt 1-mal geändert.
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:

Zwischenstand:

In der Virtuellen Konsole läuft es noch nicht.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hallo Gerold,

zunächst einmal vielen Dank für deine Mühen.
Leider scheint das Skript aber nicht zu funktionieren...

Bekomme folgenden Fehler, wenn ich das py-Skript ausführe:

Code: Alles auswählen

Traceback (most recent call last):
  File "G:\Programmieren\Workspace\Arbeit_Python\src\utf8_to_iso88591.py", line 27, in <module>
    main()
  File "G:\Programmieren\Workspace\Arbeit_Python\src\utf8_to_iso88591.py", line 24, in main
    utf8_to_iso88591(source_filename, dest_filename) 
  File "G:\Programmieren\Workspace\Arbeit_Python\src\utf8_to_iso88591.py", line 11, in utf8_to_iso88591
    f_dest.write(f_source.read()) 
  File "C:\Python25\lib\codecs.py", line 638, in write
    return self.writer.write(data)
  File "C:\Python25\lib\codecs.py", line 303, in write
    data, consumed = self.encode(object, self.errors)
UnicodeEncodeError: 'latin-1' codec can't encode character u'\ufeff' in position 0: ordinal not in range(256)

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

JR hat geschrieben:Bekomme folgenden Fehler, wenn ich das py-Skript ausführe:

Code: Alles auswählen

UnicodeEncodeError: 'latin-1' codec can't encode character u'\ufeff' in position 0: ordinal not in range(256)
Hallo JR!

Also, ich weiß auch nicht, warum du den Fehler, den ich erst in einer Python-freien Umgebung bekomme, schon ungepackt bekommst.

Außerdem weiß ich nicht warum "codecs" den BOM_UTF16_BE mit dazu packt. ???

Code: Alles auswählen

# UTF-16, big endian
BOM_BE = BOM_UTF16_BE = '\xfe\xff'
Ich probier es jetzt ohne das codecs-Modul.

mfg
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:

Hallo JR!

Ich habe das codecs-Modul aus dem Code raus gestrichen. Das codecs-Modul scheint unbedingt einen BOM einfügen zu wollen und statt diesen dann beim Umwandeln von Unicode nach "iso-8859-15" wieder raus zu schmeißen, lässt es diesen BOM drinnen. --> Fehler!

Schreibe deinen Code so um, dass dieser ohne das codecs-Modul funktioniert, dann sollte es auch mit cx_freeze laufen.

Ach ja, ich habe den Beispielcode weiter oben durch den neuen Code (ohne codecs) ausgetauscht.

mfg
Gerold
:-)

PS: So läuft es jetzt auch in einem Python-freien Windows in der Virtuellen Konsole.

.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi Gerold!

Also das geht auch nicht :-(

Ich habe dein Skript (ohne codecs-import) von oben genommen und mir lediglich die main() angepasst:

Code: Alles auswählen

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

import sys 

def utf8_to_iso88591(source_filename, dest_filename): 
    f_source = file(source_filename, "rb") 
    f_dest = file(dest_filename, "wb") 
    f_dest.write(f_source.read().decode("utf-8").encode("iso-8859-15")) 
    f_dest.close() 
    f_source.close() 

def main(): 
    if len(sys.argv) == 3: 
        source_filename = sys.argv[1] 
        dest_filename = sys.argv[2] 
        
    else: 
        source_filename = 'UTF8.txt'
        dest_filename = 'UTF8_ansi.txt' 
    utf8_to_iso88591(source_filename, dest_filename) 


if __name__ == "__main__": 
    main()
Dann habe ich Notepad.exe gestartet und

Code: Alles auswählen

Über den Wolken von Österreich!
reingeschrieben und als UTF-8 kodiert gespeichert. Wenn ich das Skript nun im selben Verzeichnis starte, bekomme ich folgenden Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "G:\Programmieren\Workspace\Arbeit_Python\src\utf8_to_iso88591.py", line 25, in <module>
    main()
  File "G:\Programmieren\Workspace\Arbeit_Python\src\utf8_to_iso88591.py", line 21, in main
    utf8_to_iso88591(source_filename, dest_filename) 
  File "G:\Programmieren\Workspace\Arbeit_Python\src\utf8_to_iso88591.py", line 9, in utf8_to_iso88591
    f_dest.write(f_source.read().decode("utf-8").encode("iso-8859-15")) 
  File "C:\Python25\Lib\encodings\iso8859_15.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position 0: character maps to <undefined>
Leider komme ich wahrscheinlich erst morgen wieder dazu, hier weiter zu forschen.

Das Rumkäpfen mit Kodierungen/ Zeichensätzen ist echt mein absolutes Hassproblem...

Vielleicht liegt es an dem verwendeten Rechner bei mir?
Werde auch dies noch ausschließen.

Viele liebe Grüße
JR
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo JR!

Ich gehe davon aus, dass du in dem Ordner, in dem dein Programm liegt noch irgendwelche alte Reste (und Unterordner) rum liegen.

mfg
Gerold
:-)

PS: XP? Vista 32? Vista 64? Python32? Python64?
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Kann es sein, dass Notepad auch bei UTF-8 eine BOM schreibt!?
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

BlackJack hat geschrieben:Kann es sein, dass Notepad auch bei UTF-8 eine BOM schreibt!?
Jap, tut es. Sehr nervig.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi!

Also alte Reste liegen da nicht. Was BOM ist, muss ich mir mal anlesen.
Oder ich verwende einfach z.B. den Editor UltraEdit o.ä.

Melde mich morgen, da ich heute nicht mehr dazukomme...

Grüße
JR
Antworten