Woher stammt der Dateipfad bei Fehlermeldung aus kompilierter EXE (cx_freeze)

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
Torres87
User
Beiträge: 1
Registriert: Mittwoch 10. August 2022, 19:14

Hallo,

ich habe ein Python-Programm mit meinem privaten Laptop erstellt und das Programm mittels cx_freeze kompiliert (als standalone EXE). Diese Programm dann meinem Arbeitgeber gegeben und aufgespielt. Das Programm lief bisher sehr gut und nun kam ein Fehler der den Pfad meines privaten Laptops aufzeigt, siehe Bild. Die Ursache des Fehlers ist mir bekannt und sehr trivial. Es fehlt die logo.gif (Startsymbol / Startscreen des Programms). In meinem Code sieht es wie folgt aus:

Code: Alles auswählen

# # Splash-Screen (Lade-Symbol am Start)
root     = Tk()
img_file = "logo.gif"
image    = PhotoImage(file=img_file)
w,h      = image.width(), image.height()
screen_width  = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
x = (screen_width  / 2) - (w / 2)
y = (screen_height / 2) - (h / 2)
root.overrideredirect(True)
root.geometry(f'{w}x{h}+{int(x)}+{int(y)}')
canvas = Canvas(root, highlightthickness=0)
canvas.create_image(0,0, image=image, anchor='nw')
canvas.pack(expand=1,fill='both')
root.after(2000, root.destroy)
root.mainloop()
Meine Frage ist warum wird in dem Fehler mein prviater Pfad angezeigt. WIe kann man das verhindern? Mein Arbeitgeber war im ersten Moment etwas besorgt weil er dachte mein Code macht im Hintergrund unschöne Sachen... Ich hoffe ihr wisst was ich meine. Danke

Bild
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil cx_freeze die kompilierten PYC-Dateien verpackt. Und die enthalten den vollen Pfad auf der Maschine, auf der sie übersetzt wurden. Ich bezweifle, das du daran was ändern kannst. Es ist aber auch vollkommen harmlos.

Das der Code kracht, ist im übrigen nicht verwunderlich: der funktioniert nur unter bestimmten Randbedingungen. Nämlich wenn das Arbeitsverzeichnis korrekt ist, denn nur dann kann der Dateinamen des Bildes korrekt aufgelöst werden. Weil es ein relativer Pfad ist, und relative Pfade IMMER unter Zuhilfenahme des Arbeitsverzeichnisses zu absoluten gewandelt werden, bevor sie für Vorgänge wie lesen oder schreiben genutzt werden.

Der Code sollte daher robuster geschrieben werden. Siehe https://cx-freeze.readthedocs.io/en/lat ... data-files
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Zudem: Du scheinst *-Importe zu benutzen. TkInter wird immer über `import tkinter as tk` importiert.
Es scheint keine main-Funktion zu geben und mehr als eine Tk-Instanz benutzt zu werden.
Wenn Du eigentlich ints willst, warum rechnest Du dann mit floats (`x = (screen_width - w) // 2`)?
Und letzlich: warum nervst Du die Nutzer damit, zwei Sekunden lang ein doofes Bild anzuschauen. Wenn im Hintergrund tatsächlich etwas gemacht wird, ist das ok, aber so!?
Antworten