Seite 1 von 1

python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 12:17
von Tos.S
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"

Re: python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 12:43
von __blackjack__
@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)

Re: python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 12:54
von Tos.S
@_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


Re: python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 13:07
von Tos.S
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.

Re: python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 13:10
von __deets__
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.

Re: python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 13:12
von Tos.S
Und wie kann ich einstellen dass meine exe auch utf8 verwenden soll?

Re: python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 13:17
von __deets__
Tut sie doch schon. Steht doch in der Fehlermeldung.

Re: python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 13:19
von Tos.S
Und was muss ich tun damit sie die sonderzeichen lesen kann?

Re: python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 13:23
von __blackjack__
@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.

Re: python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 13:24
von Tos.S
Und wie kodiere ich die Textdateien in UTF8?

Re: python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 13:25
von __deets__
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.

Re: python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 13:27
von Tos.S
Ich benutze den Windows Editor

Re: python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 13:33
von __deets__
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.

Re: python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 13:37
von Tos.S
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?

Re: python exe funktioniert nicht

Verfasst: Sonntag 14. Juli 2019, 13:39
von Tos.S
Hat sich erledigt.
Ich habe es einfach mit notepad++ konvertiert. Jetzt funktioniert es.

Vielen dank für die Hilfe.