Image.save() funktioniert nach py2exe nicht mehr

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
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Hallo Forum,

ich heiße Bernhard, melde mich zum ersten Mal im Forum. Ich habe vor vielen Jahren mal C auf dem Amiga 500 programmiert und jetzt -nach mehreren gescheiterten Versuchen Java zu lernen- jetzt mein erstes richtiges OO-Programm mit Python programmiert.

Ich kann mir vorstellen, dass Ihr py2exe nicht mehr hören könnt, aber ich habe wirklich die Suchefunktion und alles durch und keine Antwort für mein Problem gefunden:

Mein Programm ist letztlich ein ungewöhnliches Malprogramm. Der User malt in einem PIL-Image, dass in einer Tkinter-Umgebung dargestellt wird. Unter IDLE läuft alles problemlos. Nach Umwandlung mit py2exe startet das Programm problemlos, der User kann auch malen, aber das Abspeichern funktioniert nicht. Stattdessen wird eine Datei mit folgender Fehlermeldung angelegt:
Exception in Tkinter callback
Traceback (most recent call last):
File "Tkinter.pyo", line 1345, in __call__
File "lichtmusik.py", line 730, in ebenenaufloesen
File "Image.pyo", line 1289, in save
KeyError: '.png'
Die Zeile 730 meines Programms "lichtmusik.py" lautet

Code: Alles auswählen

vorher   : dateiname = tkFileDialog.asksaveasfilename(defaultextension='.png', filetypes=[('PNG-Datei','*.png'),\
			('Alle Files','*.*')],title='E....
vorher   : fertig=Image.new('RGB', (max_e*320+sp*.....
  ...
Zeile 730: fertig.save(dateiname)
Am Programm kann es eigentlich nicht liegen, denn wie gesagt: Der Interpreter gibt keinen Fehler, keine Warnung aus. Mein Setup-Script lautet ganz einfach:

Code: Alles auswählen

# setup.py fuer Lichtmusik
from distutils.core import setup
import py2exe

setup(
    options = {"py2exe": {"compressed": 1,
                          "optimize": 2,
                          "ascii": 1,
                          "bundle_files": 3 }
	},
    windows=["lichtmusik.py"]) 
Frage 1: Woran kann es liegen, dass das ganze Programm nach dem 'Kompilieren' gut läuft, außer der Image.save()-Methode?
Nebenbei hätte ich eine weniger wichtige Frage 2: Ich würde gerne noch weniger Dateien erhalten. Wenn ich aber 'bundle_files' auf einen anderen Wert, sagen wir 1, setze, startet mein Programm zwar, beendet sich aber sofort selbst mit einem wenig aussagekräftigen Fenster "Microsoft C++ Runtime Library": "This application has requested the Runtime to terminate it in an unusual way..."

Vielen Dank allen, die sich um eine Antwort bemühen,
Gruß,
ein halb-verzweifelter
Bernhard
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Bernhard hat geschrieben:Frage 1: Woran kann es liegen, dass das ganze Programm nach dem 'Kompilieren' gut läuft, außer der Image.save()-Methode?
Hi Bernhard!

Das ist ein Schuss in die Luft, da ich keine Erfahrung mit py2exe habe. Aber vielleicht hilft es, wenn du wie hier im Wiki beschrieben, die ImagePlugins importierst.

http://starship.python.net/crew/theller ... d_20py2exe

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Zu Frage 1:

Das ganze ist insofern ein py2exe-Problem, als dass Du die notwendigen PIL-Bibliotheken für PNG-Files nicht in der ausführbaren Datei mit dabei hast. Das ganze läßt sich darüber lösen dass man diese lib direkt in Deinem Script importiert. Siehe hierzu:

http://starship.python.net/crew/theller ... d_20py2exe

besonders das was unter Solutions steht. Das ganze hab ich durch 2 Minuten Googlen gefunden, das nächste Mal nicht nur im Forum suchen, ja? ;-)

Zu Frage 2:

Ich bin selbst Unix-Benutzer, hab also von py2exe nur insofern Ahnung dass ich es manchmal für meine Pakete auf Windows benutze. Ich hab bisher auch immer aufgegeben bundle_files auf einen höheren Wert zu setzen, weil ich schlicht und ergreifend immer genau diese Fehler bekommen habe. Lass es einfach so wie es ist, und schreib vielleicht noch einen Installer dazu. Alles andere ist böses debugging des py2exe codes.

--- Heiko.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Gerold, da warst Du schneller. Als ich angefangen hab zu schreiben war Dein Post aber noch nicht da, so als Rechtfertigung für das "double post." ;-)

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

modelnine hat geschrieben:Gerold, da warst Du schneller.
Hi Heiko!

Ätsch :twisted:

Hoffentlich hilft unser Tipp auch.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Hallo Leute

Zunächst meine aufrichtige Entschuldigung. Ich habe bisher für alle Probleme die Lösung selbst gefunden. Diesmal habe ich googeln wohl verschwitzt. Insgesamt gehört es aber zum Anfänger-Sein, dass man erst noch lernen muss, die richtigen Quellen aufzutun.

Euch beiden erst einmal Vielen Dank: Ein erster Versuch zeigt, dass Euer Tipp meine Frage 1 beantwortet.

Pflichtgemäß habe ich eine Suche mit Google nachgeholt und Folgendes gefunden:
PIL tries to automagically learn which Image-Plugins are available. "available" is well defined as long it is a Python standard installation. "available" gets very vague when using py2exe
(von http://starship.python.net/crew/theller ... d_20py2exe gefolgt von einem Link auf eine noch nicht geschriebene Seite)

it's a known bug in 1.1. the usual workaround is to explicitly
import the file formats you need:

from PIL import Image, PngImagePlugin, JpegImagePlugin

(note that PIL successfully imports a couple of plugins if you *open*
a file; it's only a real problem if you're writing out images you've
created internally, or if you're using less common file formats).
(von http://mail.python.org/pipermail/image- ... 01224.html)
Though not actually a bug, I recommend putting a note in the documentation
that the Image module uses dynamic __imports__ that are incompatible with
py2exe.

I also recommend telling users to explicitly import needed ImagePlugins in
Image.init():


# ******************************
# py2exe hack
import GifImagePlugin
(von http://mail.python.org/pipermail/image- ... 02159.html)

Ob nun Bug in PIL oder nicht. Damit es jetzt auch einmal im Forum steht und hier von Leuten mit ähnlichen Problemen gefunden werden kann: Um mit PIL erstellte Grafiken in einem ge(py2exe)ten Programm zu verwenden muss man zusätzlich importieren

Code: Alles auswählen

import Image
import GifImagePlugin
import PngImagePlugin
import JpegImagePlugin
import TiffImagePlugin
import BmpImagePlugin
import IcoImagePlugin
import EpsImagePlugin
import PdfImagePlugin

Plugins, von denen ich noch nichts gehört hatte. Kein Wunder, das pil-handbook.pdf erwähnt Plugins erst auf Seite 73 von 77 unter der Überschrift 'Writing Your Own File Decoder'.

Die verfügbaren Plugins findet man bei Windows-Standard-Installation unter c:\Python24\Lib\site-packages\PIL . Darunter z.B. auch ein WmfImagePlugin; in Kapitel 8. Supported file formats des o.g. handbooks ist Wmf nicht genannt und prompt funktioniert auch das Speichern damit nicht. Insgesamt bleibt bei mir der Eindruck, dass auch die PIL besser dokumentiert werden könnte. py2exe ja sowieso.

Bei meiner Frage 2 hilft das alles leider gar nicht.
Vielleicht findet sich ja noch ein Windows-Pythoner der mir/uns da auch helfen kann?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Bernhard hat geschrieben:Bei meiner Frage 2 hilft das alles leider gar nicht.
Vielleicht findet sich ja noch ein Windows-Pythoner der mir/uns da auch helfen kann?
Du kannst noch versuchen mit externen Programmen die library.zip neu zu komprimieren (muss allerdings immer noch ZIP sein, bspweise LZMA geht nicht).

Weiterhin kannst du probieren die dlls, pyds, exen usw noch mit UPX zu verpacken. Auch ist es möglich dass du einige Dateien löschen kannst, die py2exe in den dist-Ordner gepackt hat, allerdings musst du das durch trial-and-error herausfinden was geht und was nicht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten