Unix
На Unix можно передать функцию, которая включает игнорирование желаемых сигналов, через Popen(preexec_fn) параметр, например:
preexec_fn=lambda: signal.signal(signal.SIGINT, signal.SIG_IGN)
Если дочерний процесс устанавливает свой обработчик, то этот вызов не будет иметь эффект (обработчик всё равно позже будет переписан).
В этом случае вместо игнорирования сигнала, можно сделать так, чтобы по Ctrl-C сам сигнал просто не посылался процессу. Для этого его можно в другую группу процессов отправить (Ctrl-C только текущей активной группе посылается) задав start_new_session=True (или снова через preexec_fn=os.setsid (новая сессия), preexec_fn=os.setpgrp (только новая группа как правило):
import subprocess
subprocess.check_call('ping 127.0.0.1', shell=True, start_new_session=True)
Windows
На Винде preexec_fn не работает, а start_new_session=True по-прежнему передаёт Control-C.
signal(SIGINT, SIG_IGN) работает внутри самого Питон процесса и на Windows (KeyboardInterrupt не выбрасывается по Ctrl-C в этом процессе), но дочерний процесс, например, созданный с помощью multiprocessing.Process должен сам снова signal() вызывать (согласно результатам экспериментов на моей машине с Windows 7 и CPython 3.5.1).
Чтобы дочерний процесс не умирал по Ctrl-C, можно также новую группу создать (но со специфичным для Windows API):
subprocess.check_call('ping 127.0.0.1 -n 10',
creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)
Подробнее о перехвате сигналов в Питоне вообще и о Control-C в Питоне в частности.