Как отправить сигнал завершения дочернему процессу при исключении при использовании подпроцесса - PullRequest
1 голос
/ 07 июля 2019

Я запускаю программу Python из другой программы Python через подпроцесс, я называю это так.

try:
    subproc = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE, 
shell=True)
    o, e = subproc.communicate()
    sys.stdout.write(o)
    sys.stderr.write(e)
except:
    subproc.terminate()

В вызываемой программе я зарегистрировал обработчики сигналов, как показано ниже. Тем не менее, это никогда не вызывается по исключению в вышеуказанной программе, несмотря на вызов функции завершения. Но если я запускаю дочернюю программу отдельно, функция handle_exit вызывается нормально. Какую ошибку я здесь делаю?

def handle_exit(sig, frame):
    print('\nClean up code here)
    ....

signal.signal(signal.SIGTERM, handle_exit)
signal.signal(signal.SIGINT, handle_exit)

UPDATE: Хорошо, я заработал, заменив subproc.terminate на следующее.

subproc.send_signal(signal.SIGINT)
subproc.wait()

Это хорошо, но я бы также хотел получить выходные данные дочернего процесса при исключении. Как я могу получить это?

1 Ответ

0 голосов
/ 07 июля 2019

Я нашел решение, и вот оно.

try:
    subproc = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE, 
shell=True)
    o, e = subproc.communicate()
except:
    subproc.send_signal(signal.SIGINT)
    o, e = subproc.communicate()
sys.stdout.write(o)
sys.stderr.write(e)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...