64 votes

Puis-je attraper les codes d'erreur lorsque j'utilise les appels de Fabric to run() dans un shell distant ?

Normalement, Fabric s'arrête dès qu'un appel à run() renvoie un code de sortie non nul. Pour certains appels, cependant, cela est attendu. Par exemple, PNGOut renvoie un code d'erreur de 2 lorsqu'il ne parvient pas à compresser un fichier.

Actuellement, je ne peux contourner cette limitation qu'en utilisant la logique du shell ( do_something_that_fails || true o do_something_that_fails || do_something_else ), mais je préférerais pouvoir garder ma logique en Python pur (comme le promet Fabric).

Existe-t-il un moyen de vérifier un code d'erreur et d'y réagir plutôt que de laisser Fabric paniquer et mourir ? Je veux toujours les comportements par défaut pour les autres appels, donc changer son comportement en modifiant l'environnement ne semble pas être une bonne option (et si je me souviens bien, vous ne pouvez l'utiliser que pour lui dire d'avertir au lieu de mourir de toute façon).

90voto

akaihola Points 10007

Vous pouvez empêcher l'abandon sur des codes de sortie non nuls en utilisant la commande settings et le gestionnaire de contexte warn_only réglage :

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()

29voto

ArtOfWarfare Points 2345

Oui, vous pouvez. Il suffit de changer l'environnement abort_exception . Par exemple :

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>

La documentation sur abort_exception es aquí .

4voto

pluma Points 2958

Apparemment, il s'agit d'une atteinte à l'environnement est la réponse.

fabric.api.settings peut être utilisé comme un gestionnaire de contexte (avec with ) pour l'appliquer aux déclarations individuelles. La valeur de retour de run() , local() y sudo() n'est pas seulement la sortie de la commande shell, mais possède également des propriétés spéciales ( return_code y failed ) qui permettent de réagir aux erreurs.

Je suppose que je cherchais quelque chose de plus proche du comportement de subprocess.Popen ou la gestion habituelle des exceptions de Python.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X