如何检查子进程是不是正确终止? [复制]

Posted

技术标签:

【中文标题】如何检查子进程是不是正确终止? [复制]【英文标题】:How to check if subprocess terminated properly? [duplicate]如何检查子进程是否正确终止? [复制] 【发布时间】:2015-02-12 00:09:24 【问题描述】:

我想知道subprocess.call() 是否已正确终止且调用函数中没有任何错误。例如,在下面的代码中,如果提供的路径不合适,ls 命令会报错:

错误:没有这样的文件或目录。

我希望将相同的输出存储为字符串。

import subprocess
path = raw_input("Enter the path")
subprocess.call(["ls","-l",path])

【问题讨论】:

已经提出了类似的问题。 ***.com/questions/1996518/… @GeorgeSimms:通常输出和退出状态是不同的。在不检索子进程的 stdout/stderr 的情况下知道返回码可能就足够了,以检查子进程是否正确终止,例如,非零退出状态通常表示错误(取决于子进程),而不管 stdout/stderr 值如何。 @JFSebastian 作者询问-子进程是否成功(可以从退出代码的虚假性确定)-子进程的输出到stdout/stderr作为字符串(可以是通过在 Popen 的结果上调用 communicate 获得)subprocess.call 不足,因为无法检索到 stdout/stderr 的输出。否则我们可以做something_went_wrong() if subprocess.call(stuff) else we_are_ok() 【参考方案1】:

call 无法做到这一点,因为它所做的只是:

运行 args 描述的命令。等待命令完成,然后返回 returncode 属性。

所以你只能确定程序的返回码,如果没有发生错误,通常表示为零,否则为非零。

使用同一模块中的check_output 方法:

try:
    result = subprocess.check_output(["ls", "-l", path],
                                     stderr = subprocess.STDOUT)
    print result
except subprocess.CalledProcessError, e:
    print "Error:", e.output

这是working demo。

【讨论】:

我不明白反对意见。该方法显然有效,并使用了为此目的记录的方法。 可能是因为 check_output 不是 as using 调用,你会使用 check_call @PadraicCunningham 你不能在这里使用check_call,因为它不会将输出作为字符串返回。与call 类似,它只返回一个错误代码。 我错过了作为字符串部分的存储。【参考方案2】:
from subprocess import Popen, PIPE
p = Popen(["ls", "-l", path], stdin=PIPE, stdout=PIPE, stderr=PIPE)
output, err = p.communicate()
status = p.returncode
if  status:
  # something went wrong
  pass
else:
  # we are ok
  pass

虽然考虑使用os.listdir

【讨论】:

您无需阅读输出,即可检查成功状态。获取退出状态;存储subprocess.call() 返回值(整数)就足够了。在许多情况下,非零状态意味着错误。输出可以重定向到 DEVNULL,以避免噪音,例如,stderr=DEVNULL @J.F.Sebastian OP 明确表示要读取输出。 @BartoszKP:我知道。该评论适用于因其标题而登陆该页面的人。 @J.F.Sebastian 考虑改一下标题 :)

以上是关于如何检查子进程是不是正确终止? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Windows 上使用 Python 终止正在运行的子进程

如何在父进程终止后终止所有子进程?

NodeJs - 检查子进程是不是成功启动

在 C 中等待子进程终止的最佳实践

linux父子进程执行问题

如何在 python 中杀死使用 subprocess.call 调用的子进程? [复制]