Как остановить SIGINT, передаваемый подпроцессу в Python?

Мой сценарий Python прерывает сигнал SIGINT с модулем процесса сигнала для предотвращения преждевременного выхода, но этот сигнал передается подпроцессу, который я открываю с Popen., там некоторый способ предотвратить передачу этого сигнала к подпроцессу так, чтобы из этого также не выходили преждевременно, когда пользователь нажимает ctrl-c?

13
задан shino 12 July 2010 в 22:11
поделиться

1 ответ

Вы можете переназначить роль 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)
2
ответ дан 1 December 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: