Кто-то из IRC-канала #python (Freenode) помог мне, указав preexec_fn параметр subprocess.Popen (...) :
Если preexec_fn установлено в вызываемый объект, этот объект будет вызываться в дочернем процессе непосредственно перед выполнением дочернего процесса.(Только для Unix)
Таким образом, следующий код решает проблему (только для UNIX):
import subprocess
import signal
def preexec_function():
# Ignore the SIGINT signal by setting the handler to the standard
# signal handler SIG_IGN.
signal.signal(signal.SIGINT, signal.SIG_IGN)
my_process = subprocess.Popen(
["my_executable"],
preexec_fn = preexec_function
)
Примечание: Сигнал фактически не предотвращаетсядостигнув подпроцесса.Вместо этого preexec_fn выше перезаписывает обработчик сигнала по умолчанию, так что сигнал игнорируется.Таким образом, это решение может не работать, если подпроцесс снова перезаписывает обработчик SIGINT .
Еще одно примечание: Это решение работает для всех видовподпроцессы, то есть он не ограничивается подпроцессами, написанными также на Python.Например, выделенный сервер, для которого я пишу свою оболочку, фактически написан на Java.