Как захватить sys.exit() из подпроцессов в Python?

#python #python-3.x #subprocess #sys

#python #python-3.x #подпроцесс #sys

Вопрос:

Я создал master.py для запуска других скриптов.

 from subprocess import PIPE, STDOUT, run


def main():
    command = ["python3", "file1.py"]
    print("Executing: {}".format(command))
    exit_code, output_string = run_command(command)
    print(output_string)

    command = ["python3", "file2.py"]
    print("Executing: {}".format(command))
    exit_code, output_string = run_command(command)
    print(output_string)

    command = ["python3", "file3.py"]
    print("Executing: {}".format(command))
    exit_code, output_string = run_command(command)
    print(output_string)

    print("Exiting master.py with status_code of {} because {NAME_OF_FILE_THAT_FAILED} failed.")


def run_command(command_to_run):
    result = run(command_to_run, stdout=PIPE, stderr=STDOUT)
    return result.returncode, result.stdout.decode()


if __name__ == "__main__":
    main()
  

Я пытаюсь захватить sys.exit() сценарий каждого подпроцесса, то есть захватить то file1.py , file2.py с чем и file3.py выйти. Если все задания пройдены, то master.py они будут существовать с 0 , но если хотя бы 1 дополнительное задание завершилось неудачно и завершилось с 1 , я хочу, чтобы основное задание также завершилось с 1.

Как только он захватит sys.exit из всех вспомогательных заданий, основываясь на их результатах, я хотел бы напечатать эту ошибку в окончательном выводе мастера (оператор печати)

Комментарии:

1. У вас уже должно быть это exit_code .

2. Спасибо за ответ @kichik Я вижу exit_code из дочерних сценариев, однако это не отражает это в главном сценарии. Как я могу этого добиться? Пример: если exit_code возвращаемого значения нет 0 , то это должен быть статус главного скрипта.

Ответ №1:

Если подпроцесс завершается с кодом состояния 1, значение будет сохранено result.returncode . Вы можете получить сообщение об ошибке, также вернувшись result.stderr.decode() в run_command()

master.py Я полагаю, что вы можете просто управлять поведением после завершения каждого дочернего процесса, используя операторы if else .