2011-02-03 3 views
63

通常、ファブリックは、run()コールがゼロ以外の終了コードを返すとすぐに終了します。ただし、一部の呼び出しでは、これが必要です。たとえば、ファイルを圧縮できない場合、PNGOutはエラーコード2を返します。ファブリックを使用してリモートシェルでrun()コールを使用するときにエラーコードをキャッチできますか?

現在、私はシェルロジック(do_something_that_fails || trueまたはdo_something_that_fails || do_something_else)を使用してこの制限を回避することができますが、私のロジックを平凡なPythonで保つことができます(Fabricの約束通りです)。

エラーコードをチェックし、ファブリックをパニックにして死にかけるのではなく、それに反応する方法はありますか?私はまだ他の呼び出しのためのデフォルトの動作が欲しいので、環境を変更してその動作を変更するのは良い選択肢のようには見えません(とにかく、それを使うだけで、

+2

を試してみてください:[この質問は関連しています](http://stackoverflow.com/questions/3876936/how-to-continue-the-task-when-私が言ったように、私はエラーに気付き、無視しないでください。 –

+0

現在受け入れられている回答の日付が入ります。 2013年7月以降、エラーが発生したときに発生させるべき例外を指定できる環境変数があります(デフォルトは 'SystemExit'です。これはExceptionの子孫ではありません。これが原因でプログラムがクラッシュする)。私の答えを見てください:http://stackoverflow.com/a/25293275/901641 – ArtOfWarfare

+0

//私はInvokeがこれをどのように処理するのか不思議です。 –

答えて

87

あなたは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() 

更新:私の答えは時代遅れです。以下のコメントを参照してください。

+0

return_codeをチェックする必要はありません。結果の値は、タスクの成功状態に応じて真または偽と評価されます.http://docs.fabfile.org/en/1.7/api/core/operations .html#fabric.operations.run –

+1

これはタイムアウトエラーでは機能しません。 「設定あり」の有無にかかわらず、ファブリックはまだ完全に終了します。 – Cerin

+0

-1:この回答の日付は、2013年7月以降、エラーが発生したときに呼び出される例外を指定することができました。私の答えはこちらを参照してください:http:// stackoverflow。com/a/25293275/901641 – ArtOfWarfare

4

明らかに、環境を悩ますのはです。答えはです。

fabric.api.settingsをコンテキストマネージャ(with)として使用して個々のステートメントに適用できます。 run()local()およびsudo()呼び出しの戻り値は、シェルコマンドの出力だけでなく、エラーに反応する特別なプロパティ(return_codeおよびfailed)を持っています。

私はsubprocess.Popenの動作やPythonの通常の例外処理に近いものを探していたと思います。

28

はい、できます。環境の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上のドキュメントはhereです。

+1

これでは、コマンドの終了コードにアクセスすることはできません。 –

+0

@AlanPlum - 例外メッセージを受け取ることはできますが、正しいですが、終了コードを取得する方法はありません。 – ArtOfWarfare

1

誰かが重複してこのマークする前にこの

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 
+2

私は以下の結果で上記を試しました: 'TypeError:run()は、Fabric 1.10.2とParamiko 1.15.2で予期しないキーワード引数 'capture'を持っています。 – DMfll

関連する問題