Мой сценарий Python прерывает сигнал SIGINT с модулем процесса сигнала для предотвращения преждевременного выхода, но этот сигнал передается подпроцессу, который я открываю с Popen., там некоторый способ предотвратить передачу этого сигнала к подпроцессу так, чтобы из этого также не выходили преждевременно, когда пользователь нажимает ctrl-c?
Вы можете переназначить роль ctrl-c, используя tty
модуль, который позволяет вам манипулировать назначением сигналов. Однако имейте в виду, что если вы не вернете их в исходное состояние, то они сохранятся в течение всего сеанса работы оболочки, даже после выхода из программы.
Вот простой фрагмент кода для начала работы, который сохраняет старые настройки tty, переназначает ctrl-c на ctrl-x, а затем восстанавливает прежние настройки tty при выходе.
import sys
import tty
# Back up previous tty settings
stdin_fileno = sys.stdin.fileno()
old_ttyattr = tty.tcgetattr(stdin_fileno)
try:
print 'Reassigning ctrl-c to ctrl-x'
# Enter raw mode on local tty
tty.setraw(stdin_fileno)
raw_ta = tty.tcgetattr(stdin_fileno)
raw_ta[tty.LFLAG] |= tty.ISIG
raw_ta[tty.OFLAG] |= tty.OPOST | tty.ONLCR
# ^X is the new ^C, set this to 0 to disable it entirely
raw_ta[tty.CC][tty.VINTR] = '\x18'
# Set raw tty as active tty
tty.tcsetattr(stdin_fileno, tty.TCSANOW, raw_ta)
# Dummy program loop
import time
for _ in range(5):
print 'doing stuff'
time.sleep(1)
finally:
print 'Resetting ctrl-c'
# Restore previous tty no matter what
tty.tcsetattr(stdin_fileno, tty.TCSANOW, old_ttyattr)