如何在结构异常后捕获输出

时间:2013-12-10 21:49:46

标签: python fabric

我正在使用fabric在一台服务器上对另一台服务器运行命令。具体来说,我正在通过psql命令行运行SQL查询。

fabric run()函数抛出了一个我可以捕获的SystemExit异常。

如果我直接去服务器并运行psql命令,我会被告知:

psql: could not connect to server: Connection timed out
    Is the server running on host "xyz.example.com" (10.16.16.66) and accepting
    TCP/IP connections on port 5432?

所以,我知道命令不起作用,但我想要的是在psql下获取该文本,以便我的代码可以明确地解决问题。

我认为结构代码很好,因为如果我更改psql命令使它在同一台服务器上执行但是对不同的数据库执行,我没有异常和预期的答案。所以问题是我运行psql的服务器无法与其中一个数据库服务器通信。

在Fabric抛出SystemExit exeption之后,是否可以通过结构获取psql命令的结果?

供参考,以下是示例代码:

from __future__ import with_statement
from fabric.api import local, settings, abort, run, cd, execute, env
from fabric.contrib.console import confirm

import sys
import os

def test():
    try:
        count = run('psql blah blah blah',timeout=60)
        print('count: {}'.format(count))
    except Exception,ex:
        print('====> Exception type: %s' % ex.__class__)
        print('====> Exception: %s' % ex)
    except SystemExit,ex:
        print('====> Exception type: %s' % ex.__class__)
        print('====> Exception: %s' % ex)

def go():
    print "Working"
    env.host_string = "jobs0.onshift.com"
    execute(test)

1 个答案:

答案 0 :(得分:0)

查看结构文档中的settings context manager模块,以及run

返回的对象上的succeeded and failed properties
from fabric.api import *
from fabric.context_managers import settings

def test():
    with settings(warn_only = True):
        res = run('psql blah blah blah', timeout = 60)
        if res.succeeded:
            print('count: {}'.format(res))

def go():
    print "Working"
    execute(test, hosts = ["jobs0.onshift.com"])