2014-02-27 11 views
0

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

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

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

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 

回答

0

设置并获得subprocess.CalledProcessError.message。通过这种方式,当错误不被处理时显示消息,并且如果有其他程序员可能会使用该异常,那么编程就是很好的方法。

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 
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 

at except Exception,e:你可以加

traceback.print_exc() 
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。