python exe funktioniert 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
Tos.S
User
Beiträge: 11
Registriert: Donnerstag 30. Mai 2019, 17:17

Hallo zusammen,

ich habe mir ein Programm geschrieben, dass aus einer Textdatei die einzlnen Zeilen Ausließt.

Code: Alles auswählen

for j in range(len(nummernliste)):
                        datei = open("Spanisch/"+Liste[int(nummernliste[j])])
                        lines = datei.readlines()
                        dateiliste = dateiliste + lines
                        datei.close()
                        
nummernliste enthält hierbei die einzulesenen Dateien
Wenn ich das Programm Normal mit Python ausführe funktioniert es.

Ich habe es nun mit py to exe in eine exe datei umgewandelt.
Nun funktioniert es allerdings nicht mehr.
Ich habe herrausgefunden dass es an dieser Zeile liegt:

Code: Alles auswählen

 
 lines = datei.readlines()
 
Weiß jemand woran das liegt und wie man es beheben kann?

Der Code zum Umwandeln lautet:

Code: Alles auswählen

pyinstaller -y -F --hidden-import random --hidden-import sys --hidden-import os --hidden-import tkinter --hidden-import gtts --hidden-import pydub --hidden-import time  "C:/Users/Tobias_Arbeit/Desktop/Neuer Ordner/Spanisch-Vokabeln.py"
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tos.S: Was passiert denn statt dem Erwarteten und wie hast Du heraus bekommen, dass es an der gezeigten Zeile liegt?

Die ``for``-Schleife über Indexwerte nur um damit dann auf die Liste zuzugreifen ist in Python ein „anti-pattern“. Man kann in Python *direkt* über die Elemente von Sequenzwerten wie Listen iterieren, ohne den Umweg über einen Index. Wenn Du also so etwas wie ``for i in range(len(sequence)):`` schreibst, machst Du in 99,9% der Fälle etwas falsch und wolltest eigentlich ``for item in sequence:`` schreiben.

Grunddatentypen haben in Namen nichts zu suchen. Also `nummern` statt `nummernliste` und `dateien` statt `dateiliste`. Wobei letzteres inhaltlich in beiden Fällen falsch ist, denn die Liste enthält gar keine Dateien, sondern Zeilen aus Dateien. Was gar nicht geht ist ein Name wie `Liste` in Code der nicht so generisch ist, dass man da tatsächlich jede beliebige Liste für nehmen kann. Namen sollen dem Leser verraten was die Werte dahinter im Kontext des Programms bedeuten. `Liste` tut das überhaupt nicht. Und sollte zudem klein geschrieben werden.

Pfadteile setzt man nicht mit ``+`` sondern mit `os.path.join()` zusammen, oder man verwendet das `pathlib`-Modul.

Die Datei sollte man mit ``with`` zusammen öffnen, oder das ``try``/``finally`` ergänzen, damit der `close()`-Aufruf auch gemacht wird, wenn der Programmfluss da vorher ”abbiegt”, zum Beispiel durch eine Ausnahme.

Textdateie sollte man immer explizit mit einer Kodierungsangabe öffnen. (Könnte eventuell sogar Dein Problem sein!)

Man muss nicht jedes Zwischenergebnis an einen Namen binden und Dateien sind iterierbar über ihre Zeilen und Listen haben eine `extend()`-Methode.

Ungetestet:

Code: Alles auswählen

    for nummer in map(int, nummmern):
        with open(os.path.join('Spanisch', liste[nummer]), encoding='utf-8') as datei:
            total_lines.extend(datei)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Tos.S
User
Beiträge: 11
Registriert: Donnerstag 30. Mai 2019, 17:17

@_blackjack_: Danke für die Tipps, ich werde versuchen sie in Zukunft zu beachten.

Den Fehler habe ich bemerkt in dem ich zwischen die Zeilen print befehle gesetzt habe. Vor dieser Zeile hate es funktioniert danach nicht mehr.

In der exe datei kommt der Fehler:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "tkinter\__init__.py", line 1702, in __call__
  File "Spanisch-Vokabeln_neu_exe.py", line 319, in vokabelstart
  File "C:\Users\Tobias_Arbeit\AppData\Local\Programs\Python\Python37-32\lib\cod
ecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 188: invali
d start byte

Tos.S
User
Beiträge: 11
Registriert: Donnerstag 30. Mai 2019, 17:17

Ich habe gerade den Fehler gefunden!

In meinen Textdateien befinden sich sonderzeicher (äöü...)
Die kann es anscheinend nicht Lesen.

Wenn jemand weiß wie man dieses Problem behebt währe ich sehr dankbar.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst die Sonderzeichen in einem geeigneten encoding speichern, und mit dem gleichen encoding einlesen. Dazu musst du bei deinem Editor entsprechende Einstellungen vornehmen. Ein gutes encoding ist UTF8. Python verwendet das automatisch für vieles, weil sich damit alle Zeichen darstellen lassen. Auch zb asiatische etc.
Tos.S
User
Beiträge: 11
Registriert: Donnerstag 30. Mai 2019, 17:17

Und wie kann ich einstellen dass meine exe auch utf8 verwenden soll?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Tut sie doch schon. Steht doch in der Fehlermeldung.
Tos.S
User
Beiträge: 11
Registriert: Donnerstag 30. Mai 2019, 17:17

Und was muss ich tun damit sie die sonderzeichen lesen kann?
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tos.S: Die Sonderzeichen in den Dateien UTF-8 kodieren. Oder im Programm die Kodierung angeben die von den Dateien verwendet wird. Das muss halt zusammen passen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Tos.S
User
Beiträge: 11
Registriert: Donnerstag 30. Mai 2019, 17:17

Und wie kodiere ich die Textdateien in UTF8?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst an deinem Programm nichts aendern. Sondern an der Art, wie die Dateien gespeichert werden. Welchen Editor benutzt du, um die Dateien die du einlesen willst zu erstellen? Da ist dein Problem. Nicht in deinem Skript.
Tos.S
User
Beiträge: 11
Registriert: Donnerstag 30. Mai 2019, 17:17

Ich benutze den Windows Editor
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Den kenne ich nicht. Ich kenne notepad. Wie dem auch sei, bei dem Editor musst du es halt einstellen. Dazu darfst du gerne mal durch die Menues tickern um zu schauen, was es da so gibt.
Tos.S
User
Beiträge: 11
Registriert: Donnerstag 30. Mai 2019, 17:17

Ich habe es gerade mit Notepad++ probiert.
Die sonderzeichen können nur gelesen werden winn es mit ANSI encoded wird UTF8 funktioniert nicht.
Weißt du wir ich der exe datei sagen kann dass sie mit ANSI encoden soll?
Tos.S
User
Beiträge: 11
Registriert: Donnerstag 30. Mai 2019, 17:17

Hat sich erledigt.
Ich habe es einfach mit notepad++ konvertiert. Jetzt funktioniert es.

Vielen dank für die Hilfe.
Antworten