Voici un autre exemple que python 3.8+ sur linux qui inclut une réponse oui/non avec un retour par défaut sur timeout
import signal
def alarm_handler(signum, frame):
raise TimeoutError
def input_with_timeout(prompt, timeout=30):
""" obtenir une entrée avec délai d'attente
:param prompt: le message à afficher
:param timeout: délai d'attente en secondes, ou None pour désactiver
:returns: l'entrée
:raises: TimeoutError en cas de dépassement du délai
"""
# configurer le gestionnaire de signal
if timeout is not None:
signal.signal(signal.SIGALRM, alarm_handler)
signal.alarm(timeout) # générer SIGALRM dans `timeout` secondes
try:
return input(prompt)
except TimeoutError as to:
raise to
finally:
if timeout is not None:
signal.alarm(0) # annuler l'alarme
def yes_or_no(question, default='y', timeout=None):
""" Obtenir une réponse oui/non avec choix par défaut et optionnellement un délai d'attente
:param question: message
:param default: le choix par défaut, c'est-à-dire 'y' ou 'n'
:param timeout: délai d'attente en secondes, par défaut None
:returns: True ou False
"""
if default is not None and (default!='y' and default!='n'):
log.error(f'mauvaise option pour le choix par défaut : {default}')
quit(1)
y='Y' if default=='y' else 'y'
n='N' if default=='n' else 'n'
while "la réponse est invalide":
try:
to_str='' if timeout is None else f'(Délai {default} en {timeout}s)'
reply = str(input_with_timeout(f'{question} {to_str} ({y}/{n}): ',timeout=timeout)).lower().strip()
except TimeoutError:
log.warning(f'délai expiré, réponse par défaut={default}')
reply=''
if len(reply)==0:
return True if default=='y' else False
elif reply[0] == 'y':
return True
if reply[0] == 'n':
return False
Exemple d'utilisation dans le code
if yes_or_no(f'modèle {latest_model_folder} existe, démarrer à partir de là ?', timeout=TIMEOUT):
log.info(f'initialisation du modèle à partir de {latest_model_folder}')
model = load_model(latest_model_folder)
else:
log.info('création d'un nouveau modèle vide')
model = create_model()