zlib und py2exe

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
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Donnerstag 4. Januar 2007, 14:05

Hab mir ein kleines ZIP-Tool gebastelt. Würde natürlich auch gerne Kompression mit `zipfile.ZIP_DEFLATED` nutzen und nicht nur `zipfile.ZIP_STORED`. Dafür muss die zlib aber ordentlich funktionieren.

Ich hab mir zlib aus dem Netz besorgt und einfach in denselben Ordner wie meine .py entpackt. Sah also von der Ordnerstruktur her so aus:

Code: Alles auswählen

dll32
	demo
		miniunz.exe
		minizip.exe
		testzlib.exe
	zlib_bor.lib
	zlibwapi.dll
	zlibwapi.lib
static32
	zlibstat.lib
myfile.py
readme.txt
Irgendwie ging das dann auch, ohne dass die Verwendung von `zipfile.ZIP_DEFLATED` Fehler meldete. Beim Verwursten des Ganzen mittels py2exe ging es dann nicht mehr und es traten Fehler auf.

Wird `zlib` gar nicht mit in die .exe reinkompiliert? Kann man das erwirken?

Kann man eigentlich auch eine Kompressionsrate einstellen? Die zwei Optionen sind mir etwas zu wenig.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 4. Januar 2007, 14:25

droptix hat geschrieben:Ich hab mir zlib aus dem Netz besorgt und einfach in denselben Ordner wie meine .py entpackt.
:?:
zipfile Dokumentation hat geschrieben:ZIP_DEFLATED
The numeric constant for the usual ZIP compression method. This requires the zlib module.
the zlib module

Also warum lädst du dann irgendwas mit zlib runter? Die zlib ist im zlib Modul doch schon gelinkt. Die ganzen Dateien die du runtergeladen hast, sind nur nützlich wenn du die zlib in C-Programmen nutzen willst, dann brauchst du die .lib, .dll und .h. Für Python ist das bedeutungslos, Python kann damit nichts anfangen.

Die Kompression kann man übrigens beim Konstruktor von ZipFile angeben.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Donnerstag 4. Januar 2007, 15:00

Jo, ich bin über die Python-Doku auf http://docs.python.org/lib/module-zlib.html gestoßen und von dort aus auf http://www.zlib.net/ gekommen. Dort gab's den Link zlib for Windows 9x/NT/2000/XP/2003 (DLL version, plus related utilities).

Wieso ich das getan habe: weil ich unter der Benutzung von `zipfile.ZIP_DEFLATED` ursprünglich einen Fehler hatte. Ein Überfliegen der Doku von zipfile brachte mich darauf:
zipfile hat geschrieben:compression is the ZIP compression method to use when writing the archive, and should be ZIP_STORED or ZIP_DEFLATED […] If ZIP_DEFLATED is specified but the zlib module is not available, RuntimeError is also raised. The default is ZIP_STORED.
Vielleicht war es etwas zu flüchtig gelesen... hab's heute nochmal als .exe kompiliert und siehe da -> es geht!

Ich kann also nur zwei Arten von Kompression festlegen: STORED, also keine Kompression und DEFLATED. Eine Differenzierung wie bei 7-Zip (0 none, 1 fastest, 3 fast, 5 normal, 7 maximum, 9 ultra) gibt's wohl nicht?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 4. Januar 2007, 16:47

droptix hat geschrieben:Ich kann also nur zwei Arten von Kompression festlegen: STORED, also keine Kompression und DEFLATED. Eine Differenzierung wie bei 7-Zip (0 none, 1 fastest, 3 fast, 5 normal, 7 maximum, 9 ultra) gibt's wohl nicht?
Ich *glaube* nicht. In der zlib kannst du das angeben, müsstest dir wohl den Quelltext von ZipFile ansehen, um zu sehen wie das dort gelöst wird.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Donnerstag 4. Januar 2007, 18:37

7zip benutzt einen anderen Algorithmus, da macht das noch Sinn die Kompressionsstärke auswählen zu können, weil die Einfluss auf die Laufzeit und den Speicherverbrauch hat. Das ist beim Deflate-Algorithmus grundsätzlich auch so, nur dass bei aktuellen Rechnern auch die höchsten Werte keinen nennenswerten Speicher benötigen und nicht viel langsamer sind als niedrigere Werte. Ich würde mal davon ausgehen, dass einfach die höchste Stufe genommen wird.

Deflate ist zum Beispel darauf ausgelegt ein maximales "Fenster" von 64 KiB zu benutzen, das war halt damals unter DOS die grösste Einheit die sich problemlos adressieren liess. 7zip gönnt sich bei hohen Einstellungen auch mal 200 MiB Speicher beim komprimieren.
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Freitag 5. Januar 2007, 08:55

Hallo

Mit zlib.Z_DEFAULT_COMPRESSION kannst du die Kompression beeinflussen. Dabei kannst du die Werte 0-9 verwenden.

z.b:

Code: Alles auswählen

zlib.Z_DEFAULT_COMPRESSION = 8
Danach kommt dann der weitere Code in Verbindung mit dem Modul zipfile. Die Methode setzt du dann auf zipfile.ZIP_DEFLATED. Bei keiner Kompression nimmst du zipfile.ZIP_STORED.
Gruß, Harry
Antworten