Убить скрипт Python, который выполняет несколько подпроцессов - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть скрипт Python, который выполняет другие скрипты Python, используя subprocess.Моя проблема заключается в том, что если и я хочу прекратить полный процесс, например, с.crt-c, он убивает только текущую итерацию, но начинает выполнение следующей.Основной скрипт:

for fold in range(10):
    comand = "python train_kfolds_pos.py {} {}".format(current_model,fold)
    print(comand)
    process = subprocess.Popen(comand, shell=True, stdout=subprocess.PIPE)
    process.wait()
    text = process.communicate()[0].decode("utf-8")
    print(text)

1 Ответ

0 голосов
/ 29 ноября 2018

, поскольку вы не проверяете код возврата wait(), программа продолжает цикл, даже если подпроцесс прерывается.

Вы должны проверить его (и использовать список аргументов /удалить shell=True)

for fold in range(10):
    comand = ["python","train_kfolds_pos.py",current_model,str(fold)]
    print(comand)
    process = subprocess.Popen(comand, stdout=subprocess.PIPE)
    rc = process.wait()
    # quit loop if return code is not 0
    if rc:
       print("aborted, returncode {}".format(rc))
       break
    text = process.communicate()[0].decode("utf-8")
    print(text)

побочным эффектом этого является то, что, если программа завершается ненормально по какой-либо другой причине, она также останавливается.

В сторону: вы можете подумать о том, чтобы не вызыватьподпроцесс python, но напрямую вызывать функцию внутри скрипта и параметров python train_kfolds_pos.pyИсключения будут распространяться естественным образом (как и исключения прерываний клавиатуры).Что-то вроде:

import train_kfolds_pos
for fold in range(10):
    train_kfolds_pos.compute(current_model,fold)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...