使用Fabric在远程shell中运行()调用时是否可以捕获错误代码?

通常,一旦run()调用返回一个非零的退出代码,Fabric就会退出。 但是,对于一些电话,这是预期的。 例如,PNGOut在无法压缩文件时返回错误代码2。

目前我只能通过使用shell逻辑( do_something_that_fails || truedo_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_codefailed ),可以对错误做出反应。

我想我正在寻找更接近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