使用 Python 子进程检测进程是否干净退出

Detecting if a process exits cleanly with Python subprocess

我写了一个python脚本,负责执行其他脚本。 我确实注意到,时不时地,我会遇到一个已失效的进程。

我正在阅读 Whosebug 上的一些其他主题,他们说如果不使用 .communicate.call 就会遇到问题。

我现在唯一苦恼的是我还需要获取进程的退出代码。

我的代码如下。

job.append("py")
job.append("\tmp\test\sleep.py")
job.append("20")
p = subprocess.Popen(job, stderr=subprocess.PIPE,stdout=subprocess.PIPE)
exit_code_main = p.wait()

我需要从子流程的执行中获取所有输出,如果有错误输出,我需要获取。 exit code是我用来判断子进程中脚本是否执行成功的。

这里是一个如何使用 subprocess 捕获 stdout、stderr 和退出代码的示例:

    p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    stdout, stderr = p.communicate()

    logger.info("Executed notification script %s, exit code %d", args, p.returncode)
    logger.info("stdout: %s", stdout)
    logger.info("stderr: %s", stderr)

    if p.returncode != 0:
        raise RuntimeError("The script did not exit cleanly: {}".format(args))

您可以使用 check_output 来捕获任何非零退出状态:

from subprocess import check_output, CalledProcessError
try:
    out = check_output(job)
except CalledProcessError as e:
    print(e.returncode)
    print(e.message)
else:
    print(out)