L'un des frameworks CLI de Python est Cliff. Je voudrais vous dire une chose à laquelle j'étais un peu accro.
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.
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.)
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