使用 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)
我写了一个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)