Seite 1 von 1
Python Skript durch Doppelklick starten
Verfasst: Samstag 26. Mai 2012, 12:22
von nooby
Hallo Community
Wenn ich ein Python Skript über einen Doppelklick starte, ist die Ausgabe anders, als wenn ich es über Rechtsklick==>Edit with IDLE und dann run starte.
Bei meinem Beispiel sind alle Formen, auch wenn sie richtig sind falsch, wenn ich das Programm über Doppelklick starte.
Woran kann das liegen??
Code: Alles auswählen
file = open("irregularsDB.txt", "r")
wörter = {}
deutsch = []
for i in file:
i = i.strip()
ii = i.split(";")
#print(ii)
wörter[ii[0]] = ii[1]
deutsch.append(ii[0])
richtig = 0
falsch = 0
for i in deutsch:
print(i)
b = input("Gib bitte die drei Formen ein:")
c = wörter[i]
if b == c:
print("RICHTIG")
print()
richtig += 1
elif b == "exit":
break
elif b != c:
print("Richtige Form wäre:", c)
print()
falsch += 1
print("Du hast", richtig, "Richtig gehabt", "und", falsch, "falsch")
file.close()
Ich weiss die der Variablen sind schlecht gewählt.
Aber das ändere ich noch... :K
Re: Python Skript durch Doppelklick starten
Verfasst: Samstag 26. Mai 2012, 13:22
von Hyperion
Ohne die "Datenbank" können wir das hier kaum testen

Du kannst in solchen Fällen doch auch mal statisch, zwei, drei Datensätze im Quellcode platzieren, dann musst Du uns nicht noch die Datei posten.
Da Du wohl keinen Fehler, sondern ein anderes Verhalten bekommst, wäre es schon sinnvoll, das Script mal selber testen zu können - am besten mit Wörtern, die bei Dir exakt dieses Fehlverhalten produzieren.
Allgemein zum Code:
- Dateien solltest Du mittels `with` öffnen:
Code: Alles auswählen
with open(...) as handler:
# hier ist `handler` Dein File-Objekt
Damit wird die Datei garantiert geschlossen (ein explizites `close` entfällt)
- der Name `file` ist bei Python2.x eine Built-in Funktion, die man somit überschreibt. Ok, Du verwendest 3.x, da ist das dann wohl i.O. Aber ein Hinweis darauf schadet nicht, da hier ja auch viele User noch 2.x verwenden
- die Liste `deutsch` ist total überflüssig, so weit ich das überblicke. Du kannst auch über ein Dictionary iterieren und erhältst somit die Schlüssel. Du kannst sogar mittels der `items`-Methode direkt Schlüssel und Wert in einer Schleife an zwei Namen binden. Das würde den Code leserlicher und kompakter machen, da man sich dieses Binden von `c` sparte.
- Ich würde die Logik zur Auswertung anders gruppieren. Zwischen dem Text auf "richtig" und "falsch" prüfst Du auf Abbruch des Vokabeltests - das erschwert imho das Verständnis des Codes. Prüfe auf den Abbruch doch am Schluss.
- Wieso verwendest Du nicht einfach das `csv`-Modul zum Einlesen der Daten? Oder Du verwendest direkt das JSON-Format und entsprechend das `json`-Modul. Das wäre viel eleganter als Deine jetzige Parsing-Funktion. (Leerzeilen fängst Du momentan ja nicht ab... also ist das wenig robust!)
- Du kannst Methoden auch direkt "in-place" ausführen, ohne Zwischenergebnisse an einen neuen Namen (`ii`) zu binden. In diesem Falle also z.B. so:
(Ich würde das Parsen aber def. umbauen, s.o.)
Re: Python Skript durch Doppelklick starten
Verfasst: Mittwoch 6. Juni 2012, 16:29
von nooby
Danke für deine Antwort...
Sorry, dass ich so spät bin, habe etwas viel um die Ohren...
Also hier mal eine ganz einfach geänderte Version:
Code: Alles auswählen
import random
random.seed()
#file = open("irregularsDB.txt", "r")
wörter = {"sprechen": "speak spoke spoken"}
deutsch = ["sprechen"]
"""for i in file:
i = i.strip()
ii = i.split(";")
#print(ii)
wörter[ii[0]] = ii[1]
deutsch.append(ii[0])"""
richtig = 0
falsch = 0
for i in deutsch:
print(i)
b = input("Gib bitte die drei Formen ein:")
c = wörter[i]
if b == c:
print("RICHTIG")
print()
richtig += 1
elif b == "exit":
break
elif b != c:
print("Richtige Form wäre:", c)
print()
falsch += 1
print("Du hast", richtig, "Richtig gehabt", "und", falsch, "falsch")
Ich weiss deine anderen Kritikpunkte habe ich noch nicht beachtet, dass kommt noch.
Aber zum testen reichtes.
Re: Python Skript durch Doppelklick starten
Verfasst: Mittwoch 6. Juni 2012, 17:39
von Hyperion
Ich habe es jetzt nicht unter Windows getestet, daher kann ich zum Verhalten wenig sagen; bei mir unter Linux klappt es.
Lass Dir doch mal mittels `repr()` den Wert von `b` anzeigen; evtl. wird da irgend wo ein "\n" angehangen, welches dann den Vergleich stört. Etwas anderes fällt mir jetzt nicht ein.
Re: Python Skript durch Doppelklick starten
Verfasst: Mittwoch 3. Oktober 2012, 14:43
von pbachert
Hallo Forist/innen,
ich habe ebenfalls ein Problem, welches den Start von Python-Skripten mittels Mausklick betrifft.
Ich habe ein kleines Skript geschrieben, welches ich problemlos aus dem Terminal oder IDLE starten kann. Es soll das GUI für eine spätere Steuerung werden und nutzt tkinter.
Das Skript habe ich als ausführbar gekennzeichnet und allen Benutzern alle Rechte gegeben. Wenn ich im Dateimanager auf Öffnen klicke, wird sogar angezeigt, dass das Skript vermutlich ausführbar ist. Ich werde gefragt, ob ich das Skript öffnen oder ausführen will.
Trotzem passiert nichts Erkennbares, egal ob ich doppelklicke, auf Nachfrage angebe "Starten im Terminal" oder nur "Starten". Es tut sich scheinbar gar nichts.
Kann mir jemand weiterhelfen? Was habe ich falsch gemacht? Vermutlich ist dies gar nicht Python-spezifisch, sondern eine allgemeine Linux-Frage. Ich hoffe trotzdem auf Euch.
Vielen Dank und viele Grüße
pbachert
Re: Python Skript durch Doppelklick starten
Verfasst: Mittwoch 3. Oktober 2012, 15:06
von sparrow
Je nach Desktopumgebung oder Dateimanager muss unter Umständen der Dateityp mit dem Python-Interpreter verknüpft werden. Vielleicht reicht es auch die shebang korrekt zu setzen.
Re: Python Skript durch Doppelklick starten
Verfasst: Mittwoch 3. Oktober 2012, 17:52
von pbachert
sparrow hat geschrieben:Je nach Desktopumgebung oder Dateimanager muss unter Umständen der Dateityp mit dem Python-Interpreter verknüpft werden. Vielleicht reicht es auch die shebang korrekt zu setzen.
Danke für die Antwort. Ich verstehe leider nicht genug, um damit etwas anfangen zu können.
Wie kann ich Dateityp und Interpreter miteinander verknüpfen?
Shebang sieht bei mir so aus:
#!/usr/bin/env python
Danke
pbachert
Re: Python Skript durch Doppelklick starten
Verfasst: Mittwoch 3. Oktober 2012, 18:10
von BlackJack
@pbachert: Was passiert denn bei „Starten im Terminal”? Wird ein Terminal geöffnet?
Oder gibt es vielleicht irgendwelche Ausgaben in ``$HOME/.xsession-errors`` wenn Du das Programm startest?
Re: Python Skript durch Doppelklick starten
Verfasst: Mittwoch 3. Oktober 2012, 20:37
von sparrow
@pbachert: Unter KDE geht das z.B. in Dolphin (also dem Dateimanager), Rechtsklick auf die Datei, Eigenschaften und dann ein Klick auf den Schraubenschlüssel hinter "Typ".
Re: Python Skript durch Doppelklick starten
Verfasst: Samstag 6. Oktober 2012, 09:38
von pbachert
Danke für die Tipps!
@sparrow:
Unter "Eigenschaften" wird bei mir korrekt python-script angezeigt.
@BlackJack:
Hier die Ausgabe von .xsessions:
(polkit-gnome-authentication-agent-1:1681): GLib-CRITICAL **: g_variant_new_string: assertion `string != NULL' failed
(polkit-gnome-authentication-agent-1:1681): polkit-gnome-1-WARNING **: Failed to register client: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.gnome.SessionManager was not provided by any .service files
** Message: applet now removed from the notification area
** Message: using fallback from indicator to GtkStatusIcon
** Message: applet now embedded in the notification area
ERROR:root:Could not find any typelib for Dbusmenu
ERROR:root:Could not find any typelib for Unity
WARNING:root:can not import unity GI cannot import name Dbusmenu
Traceback (most recent call last):
File "/home/patric/Roboltt/Roboltt_gui.py", line 70, in <module>
im = Image.open('p2.gif')
File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1952, in open
fp = __builtin__.open(fp, "rb")
IOError: [Errno 2] No such file or directory: 'p2.gif'i
Die Angaben überfordern mich, aber die Datei p2.gif liegt im gleichen Verzeichnis wie das Skript. Wie gesagt: Bei Aufruf aus IDLE oder dem Terminal läuft das Programm einwandfrei.
Viele Grüße
pbachert
Re: Python Skript durch Doppelklick starten
Verfasst: Samstag 6. Oktober 2012, 10:53
von BlackJack
@pbachert: Relative Pfadangaben bei `open()` sind nicht relativ zum Programm sondern relativ zum aktuellen Arbeitsverzeichnis. Und das hängt davon ab von wo und wie das Programm gestartet wird. Wenn Du relativ zum Programm arbeiten möchtest, dann musst Du das explizit tun. Der Pfad zu einem Modul ist innerhalb des Moduls an den Namen `__file__` gebunden. Den Wert kann man mit `os.path`-Funktionen zusammen benutzen um Pfade zu bilden.
Re: Python Skript durch Doppelklick starten
Verfasst: Montag 8. Oktober 2012, 11:45
von pbachert
BlackJack hat geschrieben:@pbachert: Relative Pfadangaben bei `open()` sind nicht relativ zum Programm sondern relativ zum aktuellen Arbeitsverzeichnis. Und das hängt davon ab von wo und wie das Programm gestartet wird. Wenn Du relativ zum Programm arbeiten möchtest, dann musst Du das explizit tun. Der Pfad zu einem Modul ist innerhalb des Moduls an den Namen `__file__` gebunden. Den Wert kann man mit `os.path`-Funktionen zusammen benutzen um Pfade zu bilden.
@BlackJack
Danke für die Rückmeldung. Ich habe jetzt über os.chdir den Pfad gesetzt, und alles funktioniert.
pbachert