Подтвердить что ты не робот

Подпроцесс 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?

Или это зависит от того, как с ним связан внешний процесс?

4b9b3361

Ответ 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, нажатого в программе отцов.