убить подпроцесс, когда процесс Python убит? - PullRequest
6 голосов
/ 22 октября 2009

Я пишу программу на Python, которая запускает подпроцесс (используя Popen). Я читаю стандартный вывод подпроцесса, выполняю фильтрацию и пишу стандартный вывод основного процесса.

Когда я завершаю основной процесс (cntl-C), подпроцесс продолжает работать. Как мне убить подпроцесс тоже? Подпроцесс может работать долго.

Контекст: Я запускаю только один подпроцесс за раз, я фильтрую его стандартный вывод. Пользователь может решить прервать попытку чего-то другого.

Я новичок в Python и использую Windows, поэтому, пожалуйста, будьте осторожны.

Ответы [ 3 ]

5 голосов
/ 22 октября 2009

В Windows нет сигналов, поэтому вы не можете использовать сигнальный модуль. Однако вы все равно можете перехватить исключение KeyboardInterrupt при нажатии клавиши Ctrl-C.

Что-то вроде этого должно помочь вам:

import subprocess

try:
    child = subprocess.Popen(blah)
    child.wait() 

except KeyboardInterrupt:
    child.terminate()
0 голосов
/ 23 февраля 2015

Вы можете использовать модуль Python atexit.

Например:

import atexit

def killSubprocess():
    mySubprocess.kill()

atexit.register(killSubprocess)
0 голосов
/ 22 октября 2009

subprocess.Popen объекты поставляются с методом kill и terminate (отличается тем, какой сигнал вы отправляете процессу).

signal.signal позволяет устанавливать обработчики сигналов, в которых вы можете вызывать метод kill дочернего элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...