Могу ли я поймать коды ошибок при использовании Fabric для выполнения вызовов() в удаленной оболочке?
В настоящее время я могу обойти это ограничение только с помощью логики оболочки (do_something_that_fails || true
или do_something_that_fails || do_something_else
), но я бы предпочел сохранить свою логику в простом Python (как и обещание ткани).
есть ли способ, чтобы проверить код ошибки и реагировать на него, а чем иметь ткань паники и умереть? Я все еще хочу поведение по умолчанию для других вызовов, поэтому изменение его поведения путем изменения среды не кажется хорошим вариантом (и, насколько я помню, вы можете использовать это только для того, чтобы предупредить его, а не умирать в любом случае).
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