Подпроцесс Python Ctrl + C
С учетом следующего кода:
try:
subprocess.Popen(ExternalProcess, stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True).communicate()
except KeyboardInterrupt:
exit(0)
Если во время выполнения ExternalProcess
(который не является питоном script), нажимается команда Ctrl + C, что именно происходит?
Могу ли я быть уверенным на 100%, что в этой области, если я нажму на Ctrl + C, он всегда попадает в "исключение", даже если это происходит во время выполнения ExternalProcess
?
Или это зависит от того, как с ним связан внешний процесс?
Ответы
Ответ 1
Насколько я понимаю, как только вы форк/выполняете процесс, он наследует родительскую группу . Это означает, что SIGINT
(который является результатом Ctrl+C и причиной KeyboardInterrupt
) будет отправлен как дочернему, так и родительскому.
Вот пример:
Файл a.py
:
import subprocess
try:
subprocess.Popen("python b.py".split()).communicate()
except KeyboardInterrupt:
print "a.py got ctrl-c"
Файл b.py
try:
while True: pass
except KeyboardInterrupt:
print "b.py got ctrl-c"
Теперь вы запустите его и остановите:
> python a.py
^Cb.py got ctrl-c
a.py got ctrl-c
Ответ 2
Я предполагаю, что вы используете вариант Unix в своем ответе. У меня нет более глубоких знаний о мире Windows.
Если все настроено нормально, то C-c
будет интерпретироваться терминалом (xterm, gnome-terminal,...). Этот терминал отправит SIGINT (см. kill -l
, чтобы узнать, какой ваш системный номер для этого, как правило, 2) для всех процессов группы процессов, подключенных к устройству tty, связанному с этим терминалом. Это либо оболочка, либо программа, запущенная оболочкой (и все ее дочерние элементы, потому что группы процессов наследуются).
Однако ребенок может оставить свою группу процессов добровольно и создать новую. Процессы Daemon обычно делают это, чтобы случайно не убить с помощью Ctrl-C, нажатого в программе отцов.