auf input 30s lang warten und dann Programm von vorne starten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1303
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Unter Linux könntest du Signale benutzen. Da gibt es z.B. SIGALRM.

Hier mal ein Beispiel:

Code: Alles auswählen

from signal import signal
from signal import alarm
from signal import SIGALRM
from contextlib import contextmanager


def callback(*args):
    raise TimeoutError


@contextmanager
def timeout(delay, fail=True):
    signal(SIGALRM, callback)
    alarm(delay)
    try:
        yield
    except TimeoutError:
        if fail:
            raise
Verwendung:

Code: Alles auswählen

with timeout(5):
    input('Wie ist dein Name: ')
Hinsichtlich threading wäre ich mit Signalen vorsichtig. Soweit ich weiß werden die Signal-Handler vom main-thread geerbt.
Wenn man z.B. erst den Handler im main thread setzt, dann neue threads erstellt, so bekommen alle Threads auch SIGALRM und müssten entsprechend auch einen TimeoutError bekommen.

Überleg dir mal was, wie man einen Contextmanager mit threading.Timer nutzen könnte.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten