Могу ли я поймать коды ошибок при использовании Fabric для выполнения вызовов() в удаленной оболочке?


В настоящее время я могу обойти это ограничение только с помощью логики оболочки (do_something_that_fails || true или do_something_that_fails || do_something_else), но я бы предпочел сохранить свою логику в простом Python (как и обещание ткани).

есть ли способ, чтобы проверить код ошибки и реагировать на него, а чем иметь ткань паники и умереть? Я все еще хочу поведение по умолчанию для других вызовов, поэтому изменение его поведения путем изменения среды не кажется хорошим вариантом (и, насколько я помню, вы можете использовать это только для того, чтобы предупредить его, а не умирать в любом случае).

4 63

4 ответа:

вы можете предотвратить прерывание на ненулевых кодах выхода с помощью settings менеджер контекста и warn_only установка:

from fabric.api import settings

with settings(warn_only=True):
    result = run('pngout old.png new.png')
    if result.return_code == 0: 
        do something
    elif result.return_code == 2: 
        do something else 
    else: #print error to user
        print result
        raise SystemExit()

обновление: мой ответ устарел. См. комментарии ниже.

Да, вы можете. Просто измените окружающую среду abort_exception. Например:

from fabric.api import settings

class FabricException(Exception):
    pass

with settings(abort_exception = FabricException):
    try:
        run(<something that might fail>)
    except FabricException:
        <handle the exception>

документация на abort_exception и здесь.

видимо возиться с окружающей средой и ответ.

fabric.api.settings может использоваться в качестве контекстного менеджера (с with), чтобы применить его к отдельным Ведомостям. Возвращаемое значение run(),local() и sudo() вызовы - это не только вывод команды оболочки, но и специальные свойства (return_code и failed), которые позволяют реагировать на ошибки.

Я думаю, я ищу что-то ближе к поведению subprocess.Popen или обычный питон обработка исключений.

попробуй такое

from fabric.api import run, env
env.warn_only = True # if you want to ignore exceptions and handle them yurself

command = "your command"
x = run(command, capture=True) # run or local or sudo
if(x.stderr != ""):
    error = "On %s: %s" %(command, x.stderr)
    print error
    print x.return_code # which may be 1 or 2
    # do what you want or
    raise Exception(error) #optional
else:
    print "the output of %s is: %s" %(command, x)
    print x.return_code # which is 0