Python检查shell命令的退出状态

Posted

技术标签:

【中文标题】Python检查shell命令的退出状态【英文标题】:Python check exit status of a shell command 【发布时间】:2015-01-19 17:24:05 【问题描述】:

#运行shell命令的函数

def OSinfo(runthis):
        #Run the command in the OS
        osstdout = subprocess.Popen(runthis, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
        #Grab the stdout
        theInfo = osstdout.stdout.read() #readline()
        #Remove the carriage return at the end of a 1 line result
        theInfo = str(theInfo).strip()
        #Return the result
        return theInfo

#flash raid固件

OSinfo('MegaCli -adpfwflash -f ' + imagefile + ' -noverchk -a0')

#固件闪存的返回状态

?

推荐使用“subprocess.check_output()”的一个资源,但是,我不确定如何将其合并到函数 OSinfo() 中。

【问题讨论】:

你只是想检查返回码是0吗? 是的。检查是否为零,如果不是则退出1。 所以你不关心任何输出,只关心非 0 退出状态? 【参考方案1】:

如果您只想return 1,如果存在非零退出状态,请使用check_call,任何非零退出状态都会引发我们捕获的错误,return 1 否则 osstdout 将是 0

import subprocess
def OSinfo(runthis):
        try:
            osstdout = subprocess.check_call(runthis.split())
        except subprocess.CalledProcessError:
            return 1
        return osstdout

如果您传递参数列表,也不需要 shell=True。

【讨论】:

【参考方案2】:

您可以使用osstout.communicate() 而不是使用osstdout.stdout.read() 来获取子进程的stdout,这将阻塞直到子进程终止。完成此操作后,将设置属性 osstout.returncode,其中包含子进程的返回码。

你的函数可以写成

def OSinfo(runthis):
    osstdout = subprocess.Popen(runthis, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)

    theInfo = osstdout.communicate()[0].strip()

    return (theInfo, osstout.returncode)

【讨论】:

非常感谢,这正是我想要的。 对于 Windows 上的 Python 2.7,它会引发异常:ValueError: close_fds is not supported on Windows platforms if you redirect stdin/stdout/stderr :-(

以上是关于Python检查shell命令的退出状态的主要内容,如果未能解决你的问题,请参考以下文章

shell的退出状态码

在c ++中捕获shell脚本退出状态[重复]

Shell中退出状态码exit

shell从入门到精通(16)shell 退出状态码(特殊变量$?)

shell从入门到精通(15)shell 退出状态码(特殊变量$?)

shell 脚本 ssh 命令退出状态