In Python pausiert die Funktion raw_input() die Ausführung eines Skripts, bis der Benutzer irgendeine Form von Eingabe bereitstellt. Was aber, wenn Sie für diese Eingabe ein Zeitlimit festlegen möchten, um zu verhindern, dass das Skript auf unbestimmte Zeit hängen bleibt?
Implementierung eines Zeitlimits
Ein Ansatz, der für Unix-basierte Systeme anwendbar ist, ist die Verwendung der signal.alarm-Funktion. Wenn diese Funktion mit einem Zeitlimit in Sekunden aufgerufen wird, löst sie nach der angegebenen Dauer eine KeyboardInterrupt-Ausnahme aus, wodurch der Aufruf von raw_input() effektiv übersprungen wird.
Plattformübergreifende Lösungen
Für plattformübergreifende Kompatibilität oder wenn Sie Windows verwenden, besteht eine alternative Methode darin, threading.Timer in Kombination mit thread.interrupt_main zu verwenden .
import thread import threading def raw_input_with_timeout(prompt, timeout=30.0): print(prompt, end=' ') timer = threading.Timer(timeout, thread.interrupt_main) astring = None try: timer.start() astring = input(prompt) except KeyboardInterrupt: pass timer.cancel() return astring
Beachten Sie, dass dieser Ansatz sowohl benutzerinitiierte Eingaben als auch Zeitüberschreitungen gleich behandelt und für beide „None“ zurückgibt Szenarien. Wenn Sie zwischen diesen Fällen unterscheiden müssen, können Sie den Code ändern, um bei Auftreten einer Zeitüberschreitung ein Flag zu setzen und es separat im KeyboardInterrupt-Handler zu behandeln.
Windows-spezifische Implementierung
Für eine Windows-spezifische Lösung können Sie eine Schleife nutzen, die msvcrt.kbhit abfragt, um nach Benutzereingaben zu suchen und gleichzeitig die Zeit bis zu überwachen Stellen Sie sicher, dass die Zeitüberschreitung durchgesetzt wird.
import msvcrt import time def raw_input_with_timeout(prompt, timeout=30.0): print(prompt, end=' ') finishat = time.time() + timeout result = [] while True: if msvcrt.kbhit(): result.append(msvcrt.getche()) if result[-1] == '\r': return ''.join(result) time.sleep(0.1) else: if time.time() > finishat: return None
Berücksichtigen Sie die Standardeinstellung Wert
Wenn Sie vermeiden möchten, dass bei einem Timeout „None“ zurückgegeben wird, können Sie den Code ändern, um einen alternativen Standardwert anzugeben, der in solchen Fällen zurückgegeben werden soll.
Erweiterte Anpassung
Um zu verhindern, dass das Zeitlimit für Benutzer gilt, die einfach nur langsam tippen, können Sie das Timeout nach jeder Zeicheneingabe neu berechnen und so sicherstellen, dass nur der Timer läuft verfällt, wenn die Eingabe wirklich für längere Zeit pausiert wird.
Das obige ist der detaillierte Inhalt vonWie kann man in der Python-Funktion „raw_input()' ein Zeitlimit für Benutzereingaben festlegen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!