Ich möchte, dass mein Python-Skript wartet, bis der Benutzer eine beliebige Taste drückt.
Wie kann ich das tun?
Ich erhalte diesen Fehler, wenn ich versuche, dies in Python 2.7 zu tun: "SyntaxError: unerwartete EOF während Parsen".
Ich möchte, dass mein Python-Skript wartet, bis der Benutzer eine beliebige Taste drückt.
Wie kann ich das tun?
En Python 3 verwenden. input()
:
input("Press Enter to continue...")
En Python 2 verwenden. raw_input()
:
raw_input("Press Enter to continue...")
Dabei wird allerdings nur gewartet, bis der Benutzer die Eingabetaste drückt.
Man könnte Folgendes verwenden msvcrt ((Nur Windows/DOS) Die msvcrt Modul ermöglicht Ihnen den Zugriff auf eine Reihe von Funktionen in der Microsoft Visual C/C++ Runtime Library (MSVCRT):
import msvcrt as m
def wait():
m.getch()
Diese sollte auf einen Tastendruck warten.
Zusätzliche Informationen:
in Python 3 raw_input()
gibt es nicht
In Python 2 input(prompt)
ist gleichbedeutend mit eval(raw_input(prompt))
Ich erhalte diesen Fehler, wenn ich versuche, dies in Python 2.7 zu tun: "SyntaxError: unerwartete EOF während Parsen".
@Solarsaturn9 und eine wachsende und große Zahl tun dies nicht. Daher hat diese Antwort für mich und die vielen anderen, die hierher kommen, nicht funktioniert.
@richard mit input() sollte auch auf anderen Plattformen funktionieren. Es ist lächerlich, Punkte für die Bereitstellung einer alternativen Lösung nur für Windows abzuziehen, wenn die erste Lösung plattformübergreifend ist.
Verwendung von sechs für Py2 & Py3 kompatiblen Code: from six.moves import input; input("Press Enter to continue...")
Auf meinem Linux-Rechner verwende ich den folgenden Code. Dies ist ähnlich wie Code, den ich anderswo gesehen habe (in den alten Python-FAQs zum Beispiel), aber dieser Code dreht sich in einer engen Schleife, wo dieser Code nicht und es gibt viele ungerade Eckfälle, die Code nicht berücksichtigt, dass dieser Code tut.
def read_single_keypress():
"""Waits for a single keypress on stdin.
This is a silly function to call if you need to do it a lot because it has
to store stdin's current setup, setup stdin for reading single keystrokes
then read the single keystroke then revert stdin back after reading the
keystroke.
Returns a tuple of characters of the key that was pressed - on Linux,
pressing keys like up arrow results in a sequence of characters. Returns
('\x03',) on KeyboardInterrupt which can happen when a signal gets
handled.
"""
import termios, fcntl, sys, os
fd = sys.stdin.fileno()
# save old state
flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
attrs_save = termios.tcgetattr(fd)
# make raw - the way to do this comes from the termios(3) man page.
attrs = list(attrs_save) # copy the stored version to update
# iflag
attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK
| termios.ISTRIP | termios.INLCR | termios. IGNCR
| termios.ICRNL | termios.IXON )
# oflag
attrs[1] &= ~termios.OPOST
# cflag
attrs[2] &= ~(termios.CSIZE | termios. PARENB)
attrs[2] |= termios.CS8
# lflag
attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON
| termios.ISIG | termios.IEXTEN)
termios.tcsetattr(fd, termios.TCSANOW, attrs)
# turn off non-blocking
fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
# read a single keystroke
ret = []
try:
ret.append(sys.stdin.read(1)) # returns a single character
fcntl.fcntl(fd, fcntl.F_SETFL, flags_save | os.O_NONBLOCK)
c = sys.stdin.read(1) # returns a single character
while len(c) > 0:
ret.append(c)
c = sys.stdin.read(1)
except KeyboardInterrupt:
ret.append('\x03')
finally:
# restore old state
termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
return tuple(ret)
Dies ist zwar meine Lieblingsantwort, aber wie die anderen auch, werden Dinge wie Verschiebung, Kontrolle usw. nicht erfasst.
@Mala das ist in reinem Python so gut wie nicht möglich; vielleicht sollten Sie ein C-Modul schreiben?
Wenn Sie weiterlaufen wollen, bis ein Signal ausgelöst wird (wie SIGINT), können Sie auch den Rückgabewert von system
und rufen dann sys.exit(0)
.
@CarlosE Die Linux-Variante könnte auch für OSX funktionieren. Bitte lassen Sie es mich wissen, wenn es so ist.
Einfach mit
input("Press Enter to continue...")
verursacht bei der Verwendung von Python 2 den folgenden Fehler:
SyntaxFehler: EOF beim Parsen erwartet.
Eine einfache Lösung, damit der Code sowohl mit Python 2 als auch mit Python 3 funktioniert, ist die Verwendung:
try:
input("Press enter to continue")
except SyntaxError:
pass
Verwenden Sie nicht input
in Python 2 - die richtige Funktion ist raw_input
. In python 2, input
ist gleichbedeutend mit eval(raw_input())
.
Dies ignoriert alle Tasten, die der Benutzer drückt, bis er die Eingabetaste drückt, was sich von der Frage des Auftraggebers deutlich unterscheidet.
Wenn Sie "input" verwenden wollen, ist es außerdem nicht angebracht, einen SyntaxError abzufangen. Was auch immer der Benutzer eingibt, wird ausgewertet. Wenn er also zum Beispiel "1/0" eingibt, wird ein ZeroDivisionError anstelle eines SyntaxError ausgelöst, und Ihr Programm wird beendet.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.