820 Stimmen

Wie lässt man ein Python-Skript auf eine gedrückte Taste warten?

Ich möchte, dass mein Python-Skript wartet, bis der Benutzer eine beliebige Taste drückt.
Wie kann ich das tun?

849voto

riza Punkte 14808

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))

59 Stimmen

Ich erhalte diesen Fehler, wenn ich versuche, dies in Python 2.7 zu tun: "SyntaxError: unerwartete EOF während Parsen".

8 Stimmen

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

6 Stimmen

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

344voto

Greg Hewgill Punkte 882617

Eine Möglichkeit, dies in Python 2 zu tun, ist die Verwendung von raw_input() :

raw_input("Press Enter to continue...")

In Python3 heißt es einfach input()

24 Stimmen

Wie sieht es aus, wenn es einer von mehreren Schlüsseln sein kann? Nicht nur enter ?

34 Stimmen

Mit Python 3+ hat sich dies in nur input() .

0 Stimmen

Verwendung von sechs für Py2 & Py3 kompatiblen Code: from six.moves import input; input("Press Enter to continue...")

64voto

mheyman Punkte 3906

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)

2 Stimmen

Dies ist zwar meine Lieblingsantwort, aber wie die anderen auch, werden Dinge wie Verschiebung, Kontrolle usw. nicht erfasst.

2 Stimmen

@Mala das ist in reinem Python so gut wie nicht möglich; vielleicht sollten Sie ein C-Modul schreiben?

0 Stimmen

Ich bekomme " \x03 "auf Tastaturunterbrechung (Ctrl-C) auf meinem System.

49voto

CrouZ Punkte 1581

Wenn es Ihnen nichts ausmacht, sich auf Systembefehle zu verlassen, können Sie Folgendes verwenden:

Linux und Mac OS X:

import os
os.system('read -s -n 1 -p "Press any key to continue..."')
print()

Fenster:

import os
os.system("pause")

0 Stimmen

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

0 Stimmen

Gibt es eine Entsprechung für OSX?

0 Stimmen

@CarlosE Die Linux-Variante könnte auch für OSX funktionieren. Bitte lassen Sie es mich wissen, wenn es so ist.

42voto

alltrue Punkte 547

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

7 Stimmen

Verwenden Sie nicht input in Python 2 - die richtige Funktion ist raw_input . In python 2, input ist gleichbedeutend mit eval(raw_input()) .

4 Stimmen

Dies ignoriert alle Tasten, die der Benutzer drückt, bis er die Eingabetaste drückt, was sich von der Frage des Auftraggebers deutlich unterscheidet.

3 Stimmen

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

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.

Powered by:

X