Здесь есть несколько вариантов, в зависимости от того, что именно вас беспокоит. Как написано сейчас ... Нет, если бы ваш print
был вместо этого длинным набором операций, он не обязательно завершился бы, если бы вы набрали Ctrl-C.
Одна вещь, которую вы можете сделать, это временно заблокировать сигнал SIGINT
с помощью signal.pthread_sigmask
, если, скажем, вы находитесь в середине критической операции, которую не хотите прерывать, а затем снимите ее маску (в этот момент SIGINT
будет проходить до KeyboardInterrupt
как обычно). Это также может быть реализовано с помощью диспетчера контекста, как показано ниже:
#!/usr/bin/env python3
import signal
class SignalMasker:
""" Temporarily block signals. """
def __init__(self, sigs):
self.sigs = set(sigs)
def __enter__(self):
signal.pthread_sigmask(signal.SIG_BLOCK, self.sigs)
return self
def __exit__(self, *args):
signal.pthread_sigmask(signal.SIG_UNBLOCK, self.sigs)
return None
if __name__ == '__main__':
import time
interrupted = True
try:
with SignalMasker([signal.SIGINT]):
# Should not be able to interrupt this before 5 seconds expired
time.sleep(5)
interrupted = False
except KeyboardInterrupt:
print("\nGot keyboard interrupt")
assert not interrupted
Если единственное, что вы гарантируете, это то, что файловые дескрипторы закрыты и избегают трассировки стека, то то, что у вас есть сейчас, в порядке.