python异常处理不适用于fabric.api

时间:2018-07-30 00:46:25

标签: python vagrant fabric

我正在编写代码,以便它可以处理来自fabric.local的错误,但是有些代码总是会因错误而中止并且永远不会进入except块。 这是我的代码,希望可以从大家那里得到一些想法

此代码段尝试获取Vagrant ssh端口,如果vagrant没有启动,请启动它

def findsshport():
    with settings(warn_only=True):
        try:
            print 'greping port'
            return (local('vagrant ssh-config {} | grep Port'.format(env.vmId), capture=True))
        except:
            print 'vagrant not up'
            with lcd('%s' % (buildfolder)):
                local('vagrant up ext4')
            return (local('vagrant ssh-config {} | grep Port'.format(env.vmId), capture=True))

env.user = 'root'
sshPort = findsshport()
env.hosts = ['127.0.0.1:' + sshPort.split()[1]]

错误

[localhost] local: vagrant ssh-config 22921a7 | grep Port

Warning: local() encountered an error (return code 1) while executing 'vagrant ssh-config 22921a7 | grep Port'
Traceback (most recent call last):
  File "/home/testing/local/lib/python2.7/site-packages/test123/fabriclogin.py", line 114, in sshlogin
    env.hosts = ['127.0.0.1:' + sshPort.split()[1]]
AttributeError: 'NoneType' object has no attribute 'split'

更新 相似的问答

Can I catch error codes when using Fabric to run() calls in a remote shell?

3 个答案:

答案 0 :(得分:1)

似乎只是面料的警告。我的理解是,如果您在ssh上遇到错误,它不会“转换”为Python错误,这就是为什么异常块不起作用的原因。请提供错误跟踪以进行进一步分析。

答案 1 :(得分:0)

马丁是正确的,这是来自fabric.api.local的警告,并且python异常处理不会将其视为错误。取而代之的是,我看到的错误来自上述代码段返回无效内容的另一部分代码。 tryexcept一起使用,而不是使用if elsereturn_code来检查命令退出状态。

port = local('vagrant ssh-config {} | grep Port'.format(env.vmId), capture=True)
if port.return_code == 0:
    return port
else:
    with lcd('%s' % (buildfolder)):
            local('vagrant up {}'.format(env.vmId), capture=True)
        return (local('vagrant ssh-config {} | grep Port'.format(env.vmId), capture=True))

答案 2 :(得分:0)

您的问题可能在这里。

with settings(warn_only=True)

删除此行,如果命令以非零返回码退出,则本地呼叫将引发异常。

def task_name():
    with settings(warn_only=True):
        try:
            local("invalid_command")
        except:
            print("This will never print!")

让我们比较一下;

def task_name():
    try:
        local("invalid_command")
    except:
        print("This will print")