Normally Fabric quits as soon as a run() call returns a non-zero exit code. For some calls, however, this is expected. For example, PNGOut returns an error code of 2 when it is unable to compress a file.
Currently I can only circumvent this limitation by either using shell logic (do_something_that_fails || true
or do_something_that_fails || do_something_else
), but I'd rather be able to keep my logic in plain Python (as is the Fabric promise).
Is there a way to check for an error code and react to it rather than having Fabric panic and die? I still want the default behaviours for other calls, so changing its behaviour by modifying the environment doesn't seem like a good option (and as far as I recall, you can only use that to tell it to warn instead of dying anyway).
Apparently messing with the environment is the answer.
fabric.api.settings
can be used as a context manager (withwith
) to apply it to individual statements. The return value ofrun()
,local()
andsudo()
calls isn't just the output of the shell command, but also has special properties (return_code
andfailed
) that allow reacting to the errors.I guess I was looking for something closer to the behaviour of
subprocess.Popen
or Python's usual exception handling.Yes, you can. Just change the environment's
abort_exception
. For example:The documentation on
abort_exception
is here.You can prevent aborting on non-zero exit codes by using the
settings
context manager and thewarn_only
setting:Update: My answer is outdated. See comments below.
try this