Seite 1 von 2
"input" zur Unterbindung des schließens
Verfasst: Sonntag 11. Juli 2010, 10:32
von Dreiunddreißig
Hallo!
Ich bin ein Neuling unter Python und habe mir jetzt mal einen Taschenrechner gecodet. Am Ende habe ich die folgenden Zeilen stehen:
Code: Alles auswählen
input ("Druecken Sie eine beliebige Taste, um dieses Fenster zu schließen bzw. um das Programm zu beenden...")
op = None
z1 = None
z2 = None
erg = None
Die Python-Shell gibt jetzt aus:
Code: Alles auswählen
Traceback (most recent call last):
File ".../taschenrechner.py", line 61, in <module>
input ("Druecken Sie eine beliebige Taste, um dieses Fenster zu schließen bzw. um das Programm zu beenden...")
File "<string>", line 0
^
SyntaxError: unexpected EOF while parsing
Wieso parst der denn da noch? Was muss ich machen, damit er aufhört zu parsern? Danke für die Hilfe!
Gruß,
33
Re: "input" zur Unterbindung des schließens
Verfasst: Sonntag 11. Juli 2010, 10:38
von BlackJack
@Dreiunddreißig: Die Eingabe die bei `input()` gemacht wird, muss ein gültiger Python-Ausdruck sein, der einen Wert ergibt. Einfach nur die Eingabetaste zu drücken ist nicht genug. Das ist eben kein Wert.
Aber `input()` sollte man in Python <3 sowieso vermeiden und stattdessen besser `raw_input()` verwenden.
Allerdings nicht im die Konsole offen zu halten. Wenn man nicht will dass die sich schliesst, sollte man das Programm in der Konsole starten, dann bleibt die auch offen.
Und was sollen die Zuweisungen von `None` bewirken?
Re: "input" zur Unterbindung des schließens
Verfasst: Sonntag 11. Juli 2010, 10:39
von Dreiunddreißig
Wird durch die Zuweisung von None nicht die Variable gelöscht, also aus dem Arbeitsspeicher entfernt? Ich nutze Python 2.7, was ist denn der Unterschied zwischen raw_input und input?
Re: "input" zur Unterbindung des schließens
Verfasst: Sonntag 11. Juli 2010, 10:56
von BlackJack
@Dreiunddreißig: Variablen muss man nicht explizit "löschen" -- man kann es sogar nicht einmal. Wenn man einem Namen `None` zuweist, dann kann es vielleicht sein, dass Python den Speicher des Objekts freigibt, das vorher an den Namen gebunden war, das muss aber nicht sein. Das ist also überflüssiger Quelltext und Du verschwendest unnötig Gedanken. Das ist bei automatischer Speicherverwaltung nur in seltenen Ausnahmefällen nötig. Das Programmende ist sicher keiner dieser Ausnahmefälle.
Im Grunde habe ich es doch schon geschrieben: `input()` erwartet einen Python-Ausdruck als Eingabe, der zu einem Wert ausgewertet wird. Also zum Beispiel eine Zahl, oder eine literale Zeichenkette oder auch beliebig komplexe Ausdrücke mit Funktionsaufrufen und Operationen. Das kann zum einen zu Sicherheitslücken führen, weil der Benutzer nahezu beliebigen Quelltext im Kontext des Programms ausführen kann, und zum anderen können dabei auch so ziemlich alle Fehler auftreten, die man auch bei einem Programm haben kann. Von Syntax-Problemen bis zu Laufzeitfehlern. `raw_input()` gibt einfach nur die Zeichen zurück, die der Benutzer eingegeben hat, ohne die irgendwie zu interpretieren. Das hätte man aber auch in der Dokumentation nachlesen können.
Re: "input" zur Unterbindung des schließens
Verfasst: Sonntag 11. Juli 2010, 11:07
von Dav1d
Um zu verdeutlichen was BlackJack meint:
Code: Alles auswählen
>>> input()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 0
^
SyntaxError: unexpected EOF while parsing
>>> raw_input()
''
Ich habe in beiden Fällen "Enter gedrückt"
Re: "input" zur Unterbindung des schließens
Verfasst: Sonntag 11. Juli 2010, 11:27
von Dreiunddreißig
Okay. Ich nutze jetzt für Zahlen int(raw_input()). Aber gibt es einen sleep-Befehl für python?
Re: "input" zur Unterbindung des schließens
Verfasst: Sonntag 11. Juli 2010, 12:20
von BlackJack
@Dreiunddreißig: Jup, es gibt eine `sleep()`-Funktion in einem Modul in der Standardbibliothek. Die Dokumentation hat da einen praktischen Index.

Re: "input" zur Unterbindung des schließens
Verfasst: Sonntag 11. Juli 2010, 12:25
von Dreiunddreißig
Also
Danke

Re: "input" zur Unterbindung des schließens
Verfasst: Sonntag 11. Juli 2010, 12:30
von cofi
Und wenn du damit immernoch verhindern willst, dass sich das Fenster schliesst, solltest du dir das hier anschaun:
http://wiki.python-forum.de/FAQ#Wie_sta ... Skripte.3F
Re: "input" zur Unterbindung des schließens
Verfasst: Dienstag 20. Juli 2010, 14:27
von Py-Prog
Dreiunddreißig hat geschrieben:Wird durch die Zuweisung von None nicht die Variable gelöscht, also aus dem Arbeitsspeicher entfernt? Ich nutze Python 2.7, was ist denn der Unterschied zwischen raw_input und input?
@Dreiunddreißig wenn du die variablen löschen willst geht das so:
Das None die variablen nicht löscht, kannst du ganz leicht selber ausprobieren, starte die Shell und gib ein:
Und deine frage was es mit raw_input() und input() aufsich hat will ich dir auch noch beantworten. Ab Python 3000 (3.0) gibt es kein raw_input() mehr sonder input() (Und es hat sich sonst auch noch einiges geändet ...)

Re: "input" zur Unterbindung des schließens
Verfasst: Dienstag 20. Juli 2010, 14:35
von BlackJack
@Py-Prog: Damit löscht man nur die Namen aber nicht zwingend die Werte und darum ging es ja.
``del`` ist ausserdem keine Funktion, die Klammern sind also irreführend.
Und man sollte ``del`` auf Namen nur in sehr seltenen Ausnahmefällen verwenden.
Re: "input" zur Unterbindung des schließens
Verfasst: Dienstag 20. Juli 2010, 15:17
von Py-Prog
@BlackJack ich bin auf Python 3.1 umgestiegen und sowas pasiert deshalb bei mir leider öffters.
Aber irgendwie ist es bescheuert das man jetzt print() schreiben muss und nicht pirnt aber nicht del() sondern del. Das ist doch verwierend.
Re: "input" zur Unterbindung des schließens
Verfasst: Dienstag 20. Juli 2010, 16:04
von Leonidas
Naja, weil ``print`` semantisch eine Funktion ist und ``del`` semantisch ein Keyword ist, also sich nicht wie eine Funktion verhält und man auch keine Funktion implementieren kann, die die Semantik von ``del`` hat.
Re: "input" zur Unterbindung des schließens
Verfasst: Dienstag 7. September 2010, 17:55
von Py-Prog
Ha, ich habs, so:
kann man die variablen löschen.

Re: "input" zur Unterbindung des schließens
Verfasst: Dienstag 7. September 2010, 18:03
von BlackJack
Funktioniert nicht:
Code: Alles auswählen
In [546]: os.system('shutdown.exe -a')
sh: shutdown.exe: not found
Out[546]: 32512
Re: "input" zur Unterbindung des schließens
Verfasst: Dienstag 7. September 2010, 18:10
von Py-Prog
Dann geh ich davon aus das es nur mit Batch geht, dann schreibt man den befehl in eine *.bat datei und führt sie aus.
Ich hab einen fehler gemacht -a bricht das 'löschen' ab, -s ist richtig.
Re: "input" zur Unterbindung des schließens
Verfasst: Dienstag 7. September 2010, 20:54
von Leonidas
Also wenn ich das in eine *.bat-Datei schreibe dann ausführe bekomme ich:
Re: "input" zur Unterbindung des schließens
Verfasst: Mittwoch 8. September 2010, 09:57
von Py-Prog
Wieso geht das nicht in der CMD geht das ja auch? :K
Re: "input" zur Unterbindung des schließens
Verfasst: Mittwoch 8. September 2010, 10:21
von jbs
Py-Prog hat geschrieben:Technik ist: wenn alles funktioniert und keiner weiß warum.
Finde ich dazu nur klasse!
Diese Dialektik

Re: "input" zur Unterbindung des schließens
Verfasst: Mittwoch 8. September 2010, 11:54
von snafu
Py-Prog hat geschrieben:Wieso geht das nicht in der CMD geht das ja auch? :K
Weil es noch Systeme außerhalb der Windows-Welt gibt, die das eben nicht verstehen und von einem nicht unwesentlichen Teil der Python-Anwender genutzt werden. Python ist nun mal eine Sprache, die auch viel (wenn nicht sogar: vor allem) im unixoiden Umfeld verwendet wird.