如何从Python的子进程中捕获sys.exit()?

时间:2019-04-11 21:51:17

标签: python python-3.x subprocess 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.pyfile2.pyfile3.py。如果所有作业均通过,则master.py将与0存在,但是如果至少1个子作业失败并以1退出,那么我也希望主作业也以1退出。

一旦它从所有子作业中捕获了sys.exit,根据它们的结果,我想在主机的最终输出(打印语句)上打印该错误

1 个答案:

答案 0 :(得分:1)

如果子进程以状态代码1退出,则该值将存储result.returncode。您还可以通过在result.stderr.decode()

中返回run_command()来获取错误消息。

对于每个子进程终止后master.py的行为,我相信您可以使用if else语句简单地控制它。