使用Fabric在远程shell中运行()调用时是否可以捕获错误代码?
通常,一旦run()调用返回一个非零的退出代码,Fabric就会退出。 但是,对于一些电话,这是预期的。 例如,PNGOut在无法压缩文件时返回错误代码2。
目前我只能通过使用shell逻辑( do_something_that_fails || true
或do_something_that_fails || do_something_else
)来绕过这个限制,但我宁愿能够保持我的逻辑在纯Python(就像Fabric的承诺一样)。
有没有办法检查一个错误代码,并作出反应,而不是面料恐慌和死亡? 我仍然想要其他调用的默认行为,所以通过修改环境来改变它的行为似乎不是一个好的select(据我所知,只能用它来告诫它警告而不是死亡)。
您可以使用settings
上下文pipe理器和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
用作上下文pipe理器(with with
)将其应用于单个语句。 run()
, local()
和sudo()
调用的返回值不仅仅是shell命令的输出,还有一些特殊的属性( return_code
和failed
),可以对错误做出反应。
我想我正在寻找更接近subprocess.Popen
或Python通常的exception处理行为的东西。
尝试这个
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