"input" zur Unterbindung des schließens

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.
Dreiunddreißig
User
Beiträge: 8
Registriert: Sonntag 11. Juli 2010, 10:28

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
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?
Dreiunddreißig
User
Beiträge: 8
Registriert: Sonntag 11. Juli 2010, 10:28

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?
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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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"
the more they change the more they stay the same
Dreiunddreißig
User
Beiträge: 8
Registriert: Sonntag 11. Juli 2010, 10:28

Okay. Ich nutze jetzt für Zahlen int(raw_input()). Aber gibt es einen sleep-Befehl für python?
BlackJack

@Dreiunddreißig: Jup, es gibt eine `sleep()`-Funktion in einem Modul in der Standardbibliothek. Die Dokumentation hat da einen praktischen Index. :-)
Dreiunddreißig
User
Beiträge: 8
Registriert: Sonntag 11. Juli 2010, 10:28

Also

Code: Alles auswählen

import time
time.sleep(3)
Danke :)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

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:

Code: Alles auswählen

del op; del z1; del z2; del erg
Das None die variablen nicht löscht, kannst du ganz leicht selber ausprobieren, starte die Shell und gib ein:

Code: Alles auswählen

a=1
print a
a
a=None
print a
a
del a
print a # oder
a
:roll:
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 ...) :wink:
Zuletzt geändert von Py-Prog am Dienstag 20. Juli 2010, 15:17, insgesamt 1-mal geändert.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
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.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

@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.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Ha, ich habs, so:

Code: Alles auswählen

os.system('shutdown.exe -s')
kann man die variablen löschen. :D
Zuletzt geändert von Py-Prog am Dienstag 7. September 2010, 18:11, insgesamt 1-mal geändert.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
BlackJack

Funktioniert nicht:

Code: Alles auswählen

In [546]: os.system('shutdown.exe -a')
sh: shutdown.exe: not found
Out[546]: 32512
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

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.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also wenn ich das in eine *.bat-Datei schreibe dann ausführe bekomme ich:

Code: Alles auswählen

bash: ./befehle.bat: Permission denied
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Wieso geht das nicht in der CMD geht das ja auch? :K
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Py-Prog hat geschrieben:Technik ist: wenn alles funktioniert und keiner weiß warum.
Finde ich dazu nur klasse! :D

Diese Dialektik :D
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Antworten