Scriptverhalten nach Kompilierung mit 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
Bennhardt
User
Beiträge: 15
Registriert: Donnerstag 9. Februar 2006, 14:21
Wohnort: Buchholz in der Nordheide

Hallo,

ich habe so das Gefühl, dass sich meine Scripte nach dem Kompilieren mit Py2exe anders verhalten als im unkompilierten Zustand.
Ich hatte auch mit pyinstaller kompiliert -> gleiches Ergebnis: geht nicht.

Ein Beispiel:
Ich muss per Script auf einem Webserver aus der mysql-DB ein Bild laden (Ja, ich weiß - Schreibe NIE nimmer nicht Binärdaten in die DB, aber das geht nicht anders!). Wenn ich also das Script interpretierend ausführe (also getimage.py) funktionierts wunderbar. Kompiliere ich das nach exe und führe das aus, dann kommt entweder Mist oder Schrott zurück. Soll heißen, das Bild ist entweder kaputt (andere Farben, kaum was zu erkennen) oder das Bild wird vom Browser nicht mehr als Bild erkannt (kleines Viereck mit rotem Kreuz als Platzhalter).
Ich habe auch mal die Pakete mitgetracet. Scheinbar ist der Dateninhalt ein anderer, als wenn ich das eben als .py ausführe. Wie kann sowas sein?

Mein Script:

Code: Alles auswählen

# -*- coding: iso-8859-15 -*-

import sys
import MySQLdb as sql
import cgi,socket,sys

import Image
import JpegImagePlugin
Image._initialized=2 

sqlhost = socket.gethostbyname(socket.gethostname())
sqluser = 'wirdnicht'
sqlpasswd = 'verraten'
sqldb = 'meinetolledb'

formular = cgi.FieldStorage()
image_id = formular.getvalue("id")
def getvarbyrow(rowname,rowlist,result):
    try:
        rowlist
        varpos = rowlist.index(rowname)
        return result[varpos]
    except:
        return '-1'

sql_query = """
    SELECT
        image_file
    FROM
        tbl_images
    WHERE
        image_id = """ + str(image_id) + """
"""
conn = sql.connect(host=sqlhost,db=sqldb,user=sqluser,passwd=sqlpasswd)
conn.query(sql_query)
curs = conn.store_result()
result = curs.fetch_row()
image_file = result[0][0].tostring()
html_string = 'Content-Type: image/jpeg\n'
html_string += '\n'
html_string += image_file
print html_string

Aufgerufen wird das in etwa so:

http://localhost/getimage.exe?id=123

Was dann eben das 123ste Bild aus der DB holt und anzeigt.
Ich denke mal, am Code liegt das nicht. Eher am Compiler.

Code: Alles auswählen

from distutils.core import setup
import py2exe
import codecs
setup(
    version = "2.1",
    description = "getimage",
    name = "getimage",
    options={"py2exe":{"optimize":2}},
    console = ["getimage.py"],
    )
Ich nutze Python 2.3 (aber auch mit 2.4 klappts nicht) und Py2exe 0.5.4.
Um Fragen im Voraus auszuschließen:
NEIN, ich kann das Script nicht interpretiert laufen lassen, es MUSS als EXE gestartet werden.
JA, das Bild muss binär in der DB stehen.
JA, IIS ist nötig.
NEIN, ich werde kein Linux vorziehen ;-)

Danke,
Ben
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Hallo Bennhardt,

ziemlich merkwürdig. Kann es auch nicht erklären. Ich habe selber Probleme mit py2exe gehabt. Ich bin dann auf cxFreeze umgestiegen.
Dies ist auch ein Python Executable-Maker. Vielleicht versuchst du es mit dem, ob es klappt.

Gruss,
Toni
Bennhardt
User
Beiträge: 15
Registriert: Donnerstag 9. Februar 2006, 14:21
Wohnort: Buchholz in der Nordheide

Danke für den Tip.
Ich habe noch bisschen rumexperimentiert. Ich glaube, Py2Exe verwurschtelt beim Kompilieren auskommentierte Zeilen (also alles, was mit # auskommentiert wurde), sodass diese Zeilen dann wieder unkommentiert sind - IRGENDWIE. Egal.

Ich wünsch was...
Ben
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Hat bei mir bei relativ grossen Files problemlos geklappt.

Evtl hat er nicht alle files fürs includen gefunden ?
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Also py2exe "verwuschelt" garantiert nicht die # Kommentare.
Habe damit schon zig Programme in eine EXE gewandelt und es
hat immer geklappt. Nachdem ich mir die Module von deinem Programm
geholt habe und py2exe mal laufen ließ kam folgende Meldung:

Code: Alles auswählen

The following modules appear to be missing
['DateTime', 'mx.DateTime']

*** binary dependencies ***
Your executable(s) also depend on these dlls which are not included,
you may or may not need to distribute them.

Make sure you have the license if you distribute any of them, and
make sure you don't distribute files belonging to the operating system.

   ADVAPI32.dll - C:\WINNT\system32\ADVAPI32.dll
   WS2_32.dll - C:\WINNT\system32\WS2_32.dll
   USER32.dll - C:\WINNT\system32\USER32.dll
   WSOCK32.dll - C:\WINNT\system32\WSOCK32.dll
   SHELL32.dll - C:\WINNT\system32\SHELL32.dll
   GDI32.dll - C:\WINNT\system32\GDI32.dll
   KERNEL32.dll - C:\WINNT\system32\KERNEL32.dll
Merkwürdig :) Ob der Fehler nur bei mir auftritt - keine Ahnung. War
wohl auch keine große Hilfe, aber habs versucht ^^
Bennhardt
User
Beiträge: 15
Registriert: Donnerstag 9. Februar 2006, 14:21
Wohnort: Buchholz in der Nordheide

@Mad-Marty
Nee Nee,
das Problem habe ich auch bei kleinen Scripten (50 Zeilen) und auch ohne exotische Libs oder Module.
Na mal sehn. Ich habs jetzt anders gelöst.

@Prostata:
interessanter Hinweis. Muss ich mal gucken.
Dennoch trau ich Py2Exe nicht über den Weg (trau keinem Tool, was du nicht selber verzapft hast oder so).
Antworten