5 Stimmen

Python: Warten auf Tastendruck oder bis zum Timeout

Ich habe ein langlaufendes Python-Skript in einer Terminal-Sitzung (der Host-Rechner ist ein FreeBSD-System), das alle 9 Minuten eine Aufgabe ausführt. Nun möchte ich in der Lage sein, diesen Sleep-Aufruf jederzeit zu unterbrechen, damit die Aufgabe sofort ausgeführt wird.

Wie kann ich das tun? Fangen Ctrl + C ist keine Option, da das Programm angehalten werden muss (und nicht nur der Ruhezustand unterbrochen werden soll). Alles andere, was ich mit einem Terminalfenster und einer Tastatur machen kann, ist in Ordnung.

2 Stimmen

"Die Tastenkombination Strg+C ist keine Option, da ich sie benötige, um das Programm zu beenden." Was ist das?

0 Stimmen

@IgnacioVazquez-Abrams, manchmal muss ich das Programm stoppen, und der einfachste Weg ist, Strg+C zu drücken. Daher möchte ich das Programm nicht unterbrechen. sleep durch das Einfangen der KeyboardInterrupt .

1 Stimmen

Müssen Sie in der Lage sein, das Programm durch einmaliges Drücken der Tastenkombination Strg+C zu beenden? Sie könnten es beim ersten Mal abfangen und beim zweiten Mal beenden. Was ist mit dem Abfangen eines weiteren Signals?

3voto

zneak Punkte 129366

Auf Anregung von Thomas habe ich diese Funktion entwickelt:

import signal

def input_or_timeout(timeout):
    def nothing(sig, frame): pass
    signal.signal(signal.SIGALRM, nothing)
    signal.alarm(timeout)
    try:
        raw_input()
        signal.alarm(0)
    except (IOError, EOFError): pass

Es wartet auf Eingaben für höchstens timeout Sekunden.

Unter Windows könnten Sie vermutlich die raw_input() con getch() de msvcrt .

1 Stimmen

Unter Windows können Sie diesen Code überhaupt nicht verwenden, da er SIGALRM nicht unterstützt.

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