Config-file in Pychar funktioniert es, umgewandelt als EXE geht es nicht

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
Herbie77
User
Beiträge: 7
Registriert: Dienstag 25. Januar 2022, 14:02

Hallo
Ich habe ein kleines Script das Daten aus einer Datei ausliest und in CSV Datei schreibt. Das funktioniert auch.
Nun ist es jedoch so, dass wenn das Programm bei mir auf dem PC läuft, die Daten auf Laufwerk X: nehmen muss und wenn das Programm auf dem Server läuft, dann ist es das Laufwerk C:
Dazu habe ich eine config-Datei erstellt.

Die ini Datei hat den Namen: gfos-laufzeit.ini und enthält lediglich diese Werte
[laufwerk]
lw = X:


Im Programm sieht es dann so aus:

from configparser import ConfigParser
file = 'gfos_laufzeit.ini'
config = ConfigParser()
config.read(file)

l = config['laufwerk']['lw']
print(
l)

Ergebnis X:

Das funktioniert auch einwandfrei.

Ich habe das Script mit dem Befehle "auto-py-to-exe" als EXE Datei erstellt.

Wenn ich nun das Programm laufen lasse, als EXE sozusagen, dann erscheint diese Fehlermeldung:

Traceback (most recent call last):
File "gfos_laufzeit_saldenimp.py", line 33, in <module>
File "configparser.py", line 964, in __getitem__
KeyError: 'laufwerk'
[15628] Failed to execute script 'gfos_laufzeit_saldenimp' due to unhandled exception!

Habe mir dazu schon verschiedene Beitärge auf Youtube angeschaut, jedoch nichts aussagekräftiges dazu gefunden. Es klappt ja im Prinzip als Script , jedoch nicht als EXE- Programm.

Hat jemand einen Tip?
Danke
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Deine Config-Datei wird nicht gefunden, weil sie nicht an der Stelle ist, wo du sie vermutest.
Unter der Haube wird "pyinstaller" verwendet. Pyinstaller nimmt den Python-Interpreter, die benötigten Module und dein Script. Das alles packt er in ein selbstentpackendes Archiv -> das was du für die .exe hälst.
Wenn die .exe ausgeführt wird, wird das alles in ein temporäres Verzeichnis entpackt und der Interpreter mit deinem Script gestartet. Der Ort, an dem das Programm dann liegt, ist dann aber nicht mehr der Ort, an dem du es vermutest.

Pyinstaller setzt ein Atribut "frozen" um zu signalisieren, dass es eine .exe-Datei ist, die gerade ausgeführt wird. Und in dem Fall (und nur dann!) kommst du über sys.executable an den Ort, wo die ursprüngliche .exe liegt.

Also verwendest du diese Funktion um an das Verzeichnis zu kommen, in dem dein Programm liegt:

Code: Alles auswählen

import sys
from pathlib import Path

def get_basedir():
    if getattr(sys, 'frozen', False):
        path = Path(sys.executable)
    else:
        path = Path(__file__)
    return path.parent

Antworten