Antworten:
Verwenden Sie in Python 3input()
:
input("Press Enter to continue...")
In Python 2 verwenden Sie raw_input()
:
raw_input("Press Enter to continue...")
Dies wartet jedoch nur darauf, dass der Benutzer die Eingabetaste drückt.
Möglicherweise möchten Sie msvcrt verwenden ((nur Windows / DOS). Das msvcrt- Modul bietet Ihnen Zugriff auf eine Reihe von Funktionen in der Microsoft Visual C / C ++ - Laufzeitbibliothek (MSVCRT)):
import msvcrt as m
def wait():
m.getch()
Dies sollte auf einen Tastendruck warten.
Zusätzliche Information:
in Python 3 raw_input()
existiert nicht
In Python ist 2 input(prompt)
gleichbedeutend miteval(raw_input(prompt))
input
nicht fort, wenn eine Taste gedrückt wird, sondern nur, wenn die Eingabetaste gedrückt wird.
Eine Möglichkeit, dies in Python 2 zu tun, besteht darin, Folgendes zu verwenden raw_input()
:
raw_input("Press Enter to continue...")
In Python3 ist es nur input()
enter
?
input()
.
Auf meiner Linux-Box verwende ich den folgenden Code. Dies ähnelt dem Code, den ich an anderer Stelle gesehen habe (zum Beispiel in den alten Python-FAQs), aber dieser Code dreht sich in einer engen Schleife, in der dieser Code dies nicht tut, und es gibt viele seltsame Eckfälle, in denen der Code dies nicht berücksichtigt 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)
Wenn Sie mit den Systembefehlen einverstanden sind, können Sie Folgendes verwenden:
Linux:
import os
os.system('read -sn 1 -p "Press any key to continue..."')
print
Windows:
import os
os.system("pause")
system
und dann aufrufen sys.exit(0)
.
Einfach benutzen
input("Press Enter to continue...")
verursacht einen SyntaxError: erwartete EOF beim Parsen.
Einfache Fixverwendung:
try:
input("Press enter to continue")
except SyntaxError:
pass
input
in Python 2 verwenden - die richtige Funktion ist raw_input
. In Python 2 input
ist äquivalent zu eval(raw_input())
.
Das Python- Handbuch enthält Folgendes:
import termios, fcntl, sys, os
fd = sys.stdin.fileno()
oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)
oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
try:
while 1:
try:
c = sys.stdin.read(1)
print "Got character", repr(c)
except IOError: pass
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
welches in Ihren Anwendungsfall gerollt werden kann.
Plattformübergreifender Python 2/3 Code:
# import sys, os
def wait_key():
''' Wait for a key press on the console and return it. '''
result = None
if os.name == 'nt':
import msvcrt
result = msvcrt.getch()
else:
import termios
fd = sys.stdin.fileno()
oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)
try:
result = sys.stdin.read(1)
except IOError:
pass
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
return result
Ich habe das fctl / nicht blockierende Zeug entfernt, weil es IOError
s gab und ich es nicht brauchte. Ich verwende diesen Code speziell, weil ich möchte, dass er blockiert wird. ;)
Nachtrag:
Ich habe dies in einem Paket auf PyPI mit vielen anderen Extras namens Konsole implementiert :
>>> from console.utils import wait_key
>>> wait_key()
'h'
Ich kenne keine plattformunabhängige Methode, aber unter Windows können Sie, wenn Sie das msvcrt-Modul verwenden, dessen getch-Funktion verwenden:
import msvcrt
c = msvcrt.getch()
print 'you entered', c
mscvcrt enthält auch die nicht blockierende Funktion kbhit (), um festzustellen, ob eine Taste gedrückt wurde, ohne zu warten (nicht sicher, ob es eine entsprechende Fluchfunktion gibt). Unter UNIX gibt es das Curses-Paket, aber Sie sind sich nicht sicher, ob Sie es verwenden können, ohne es für die gesamte Bildschirmausgabe zu verwenden. Dieser Code funktioniert unter UNIX:
import curses
stdscr = curses.initscr()
c = stdscr.getch()
print 'you entered', chr(c)
curses.endwin()
Beachten Sie, dass curses.getch () die Ordnungszahl der gedrückten Taste zurückgibt, damit sie dieselbe Ausgabe hat, die ich zum Umwandeln hatte.
Wenn Sie auf die Eingabe warten möchten (damit der Benutzer, der auf die Tastatur klopft, nicht dazu führt, dass etwas Unbestimmtes passiert), verwenden Sie
sys.stdin.readline()
Ich bin neu in Python und dachte bereits, ich sei zu dumm, um die einfachsten Vorschläge zu reproduzieren, die hier gemacht wurden. Es stellt sich heraus, dass es eine Falle gibt, die man kennen sollte:
Wenn ein Python-Skript von IDLE ausgeführt wird, scheinen sich einige E / A-Befehle völlig anders zu verhalten (da es tatsächlich kein Terminalfenster gibt).
Z.B. msvcrt.getch ist nicht blockierend und gibt immer $ ff zurück. Dies wurde bereits vor langer Zeit gemeldet (siehe z. B. https://bugs.python.org/issue9290 ) - und es wurde als behoben markiert. Irgendwie scheint das Problem in aktuellen Versionen von Python / IDLE weiterhin zu bestehen.
Wenn einer der oben genannten Codes für Sie nicht funktioniert, führen Sie das Skript manuell und NICHT über IDLE aus .
Wenn Sie sehen möchten, ob sie eine genaue Taste gedrückt haben (z. B. 'b'), gehen Sie folgendermaßen vor:
while True:
choice = raw_input("> ")
if choice == 'b' :
print "You win"
input("yay")
break
os.system scheint immer sh aufzurufen, das die Optionen s und n zum Lesen nicht erkennt. Der Lesebefehl kann jedoch an bash übergeben werden:
os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")