Un peu d'informations addictives sur Cliff, le framework CLI

introduction

L'un des frameworks CLI de Python est Cliff. Je voudrais vous dire une chose à laquelle j'étais un peu accro.

À propos de Cliff

Voir ici pour plus d'informations. Un framework qui facilite la création d'outils CLI. Écrivez juste un peu et cela fera un bon travail de retour des valeurs du programme et --help. Tout ce que vous avez à faire est de créer main.py et de le mapper à chaque classe de commande avec setup.py etc.

À propos de la classe de commande Cliff

La classe de commande la plus basique est la classe Command. C'est comme faire une commande en héritant de cela.

sample.py


from cliff.command import Command

class SampleCommand(Command):
    #~~Ce que vous voulez que la commande fasse~~

Par défaut, certaines classes héritent de la classe Command. Si vous ne souhaitez renvoyer qu'un seul objet, vous pouvez utiliser ShowOne. Si vous souhaitez renvoyer une liste d'objets, vous pouvez hériter de la classe Lister. Si vous renvoyez un tableau de clés et de valeurs dans la fonction de classe, , Il peut être transformé en table sans autorisation, ou il peut être transformé en JSON ou YAML en spécifiant des options.

Fondamentalement, la commande est implémentée comme suit.

sample.py


from cliff.command import Command

class SampleCommand(Command):

    def get_parser(self, prog_name)
        parser = super().get_parser(prog_name)
        #Ajouter un argument
        parser.add_argument('something')    #Arguments requis
        parser.add_argument('--some')       #Arguments optionnels
        parser.add_argument('--so', '-s')   #Vous pouvez également ajouter un système raccourci
        return parser

    def take_action(self, parsed_args):
        #Exécuter le traitement
        return something

La valeur de retour dans le take_action ci-dessus sera essentiellement retournée à l'exécution. (Strictement parlant, take_action est enveloppé dans la fonction d'exécution, donc si vous faites diverses choses, ce sera un désordre.)

Ce à quoi j'étais accro

Lorsque j'ai essayé de retourner JSON ou dict dans take_action de la classe de commande qui a hérité de la classe de commande ci-dessus, la sortie de la commande n'était que la sortie d'erreur standard.

sample.py


import json
from cliff.command import Command

class SampleCommand(Command):

    def get_parser(self, prog_name)
        parser = super().get_parser(prog_name)
        parser.add_argument('arg1')
        return parser

    def take_action(self, parsed_args):
        #Exécuter le traitement
        return json.dumps(something)

shell.sh


samplecommand arg1 > log
#Pour une raison quelconque, la sortie sort dans le terminal!
samplecommand arg1 2> log
#Il n'y aura pas de sortie

La raison en est que la valeur de retour de take_action dans une classe de commande qui hérite de la classe Command est l'état de fin de la commande. En d'autres termes

sample.py


from cliff.command import Command

class SampleCommand(Command):

    def get_parser(self, prog_name)
        parser = super().get_parser(prog_name)
        parser.add_argument('arg1')
        return parser

    def take_action(self, parsed_args):
        #Exécuter le traitement
        return 100

Quand ça devient

shell.sh


samplecommand arg1
echo $?
#100 sorties

Ce sera. Étant donné que JSON, dict et autres objets sont essentiellement considérés comme True, la valeur de retour de toutes les commandes sera 1, et si l'état de fin est 1, il sera jugé comme une erreur et sera envoyé à la sortie d'erreur standard.

Pourquoi.

(Si vous allez bien, lancez une pull request)

Recommended Posts

Un peu d'informations addictives sur Cliff, le framework CLI
Un peu plus sur le FIFO
Une histoire un peu plus profonde sur la blockchain, le monde numérique
Après avoir fait des recherches sur la bibliothèque Python, j'ai un peu compris egg.info.
Notes diverses sur le framework Django REST
Un mémo que j'ai essayé le tutoriel Pyramid
Obtenez les dernières informations AMI avec l'AWS CLI
Un programmeur Java a étudié Python. (À propos des décorateurs)
J'ai réfléchi un peu à l'API grandissante de TensorFlow
Écrire une note sur la version python de python virtualenv
Framework Django REST Un peu utile à savoir.
Un mémorandum sur la bibliothèque de wrapper Python tesseract
Une note sur la nouvelle classe de base de style
J'ai fait un peu de recherche sur la classe