如何在check_output中查看异常的输出

时间:2014-02-27 20:23:49

标签: python output

我有一些运行Windows命令的Python 2.7代码。如果命令成功,则返回输出。 (更具体地说,它在多行输出中搜索搜索词,然后返回具有该搜索词的行。)

如果命令失败,它只返回“错误”

我想修改此代码以返回实际的错误消息。如何使我的函数的“异常”部分返回命令输出的实际错误消息?

def myFunction(machineName):
try:
    output = subprocess.check_output('command ' + machineName)
    for line in output.split('\n'):
        if 'TextToSearchFor' in line:
            return line
except subprocess.CalledProcessError:
    return "Error"
return

4 个答案:

答案 0 :(得分:0)

设置并获取subprocess.CalledProcessError.message。这样就可以在没有处理错误的情况下显示消息,如果其他程序员有可能使用此异常,则可以很好地编程。

答案 1 :(得分:0)

文档实际上有an example:在通话中使用stderr=subprocess.STDOUT

它还提到subprocess.CalledProcessError有一个output属性,其中包含进程的任何输出(我假设这是stdout,但也许stderr,在这种情况下你不需要在呼叫本身中设置stderr

因此,您应该可以使用(未​​经测试):

try:
    output = subprocess.check_output('command ' + machineName)
    for line in output.split('\n'):
        if 'TextToSearchFor' in line:
            return line
except subprocess.CalledProcessError:
    print subprocess.CalledProcessError.output
    return "Error"
return

答案 2 :(得分:0)

您可以使用例外:

def myFunction(machineName):
    try:
        output = subprocess.check_output('command ' + machineName)
        for line in output.split('\n'):
            if 'TextToSearchFor' in line:
                return line
    except Exception, e:
        print e
        return "Error"
    return

如果您对堆栈跟踪感兴趣,可以执行以下操作:

import trace

除了Exception,e:你可以添加

traceback.print_exc()

答案 3 :(得分:0)

注意 - 您捕获的异常不是您可能期望的唯一例外:

>>> import subprocess
>>> try:
...     output = subprocess.check_output("nosuch")
... except Exception as e:
...     print str(e)
...
[Errno 2] No such file or directory
>>> e
OSError(2, 'No such file or directory')
>>> type(e)
<type 'exceptions.OSError'>

另请注意,函数的接口意味着您必须对错误进行特定检查,从而导致逻辑失去清晰度,因为每个调用必须如下所示:

result = myFunction(someArg):
if result.startswith("error"):
    # handle issue somehow
else:
    # normal logic flow to do something with result

通过从函数中删除错误检查并在调用时处理结果异常,在适当的位置处理异常实际上要简单得多。您的代码将如下所示

try:
    # normal logic flow to do something with result
except (tuple, of, exceptions) as e:
    # handle issue somehow

另请注意,异常可以转换为dtrings,这通常会为您提供任何相关的错误消息,如开头示例中所示,这样就可以解答您的问题。

如果你的Python足够新,你应该使用except ... as name:格式而不是except ..., name:,因为它将不加改变地迁移到Python 3。