如何检查子进程是不是正确终止? [复制]
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 考虑改一下标题 :)以上是关于如何检查子进程是不是正确终止? [复制]的主要内容,如果未能解决你的问题,请参考以下文章