Poiché non stai eseguendo il threading (e presumo che sia intenzionale e in alcuni casi saggio) devi utilizzare un tipo di interrupt. I segnali sono un tipo di interruzione sui sistemi Unix per consentire di tornare a una richiamata durante una chiamata che potrebbe bloccarsi.
Questo esempio di un file aperto che non verrà mai restituito è in linea con quello che vuoi fare. È tratto da http://docs.python.org/library/signal.html#module-signal
Ma un avvertimento. Poiché Python utilizza un Global Interpreter Lock per eseguire la gestione del segnale del sistema operativo, è soggetto ad alcuni problemi di stabilità. Questi problemi dovrebbero essere rari normalmente però.
import signal, os
def handler(signum, frame):
print 'Signal handler called with signal', signum
raise IOError("Couldn't open device!")
# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)
# This open() may hang indefinitely
fd = os.open('/dev/ttyS0', os.O_RDWR)
signal.alarm(0) # Disable the alarm