Implémentez facilement des sous-commandes avec python click

introduction

Dans le commentaire de Qiita, j'ai vérifié le clic qui a été introduit et j'ai trouvé qu'il était facile d'implémenter des sous-commandes, je vais donc résumer comment le faire. Une sous-commande est une commande dans laquelle le premier argument du script est une commande, qui se trouve dans les commandes de gestion de version telles que git et svn, et dans le script de gestion de projet de django manage.py.

Environnement

click n'est pas un package python standard, donc installez-le avec pip.

$ pip install click

De base

Le code de base ressemble à ceci:

import click

@click.group(invoke_without_command=True)
@click.pass_context
def cli(ctx):
    if ctx.invoked_subcommand is None:
        print ctx.get_help()
    else:
        print('gonna invoke %s' % ctx.invoked_subcommand)


@cli.command(help='description 1')
@click.argument('target', required=False)
def subcommand1(target):
    print "sub command 1"

@cli.command(help='description 2')
@click.argument('target', required=False)
def subcommand2(target):
    print "sub command 2"

if __name__ == '__main__': cli()

cli est la fonction de départ pour tout, et subcommand1 et subcommand2 sont respectivement les implémentations des sous-commandes. Saisissez chaque description en tant que variable d'aide dans @ cli.command. Ce qui suit montre le contenu de l'aide sur les commandes affichée.

Usage: sample.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  subcommand1  description 1
  subcommand2  description 2

Vous pouvez voir que les sous-commandes 1 et 2 sont enregistrées dans les commandes.

Tips

Créer un raccourci

(Sous) Le nom de la commande est peut-être trop long et vous souhaiterez peut-être créer une commande de raccourci. Dans ce cas, étendez la classe Group et implémentez-la.

...

class AliasedGroup(click.Group):
    def get_command(self, ctx, cmd_name):
        rv = click.Group.get_command(self, ctx, cmd_name)
        if rv is not None:
            return rv

        if cmd_name == 'shortcut':
            return click.Group.get_command(self, ctx, 'subcommand1')

        return None

@click.group(cls=AliasedGroup, invoke_without_command=True)
@click.pass_context
def cli(ctx):
...

Comme mentionné ci-dessus, spécifiez le AliasGroup implémenté en tant qu'argument cls de @ click.group. Puis

$ python ./sample.py shortcut
gonna invoke shortcut
sub command 1

L'implémentation de sabcommand1 fonctionne comme ci-dessus.

Faire d'une implémentation de commandes normales une sous-commande

Si vous souhaitez diviser en plusieurs fichiers et implémenter des sous-commandes, vous pouvez implémenter la commande et l'ajouter au groupe.

@click.group(invoke_without_command=True)
@click.pass_context
def handle(ctx):
    if ctx.invoked_subcommand is None:
        print ctx.get_help()
    else:
        print('gonna invoke %s' % ctx.invoked_subcommand)

@click.command()
def hoge():
    pass

handle.add_command(hoge)

à partir de maintenant

Dès que je l'essayerai, j'aimerais vous présenter l'implémentation des commandes concaténées.

Recommended Posts

Implémentez facilement des sous-commandes avec python click
Faites facilement un bip avec python
[python3] Implémentez facilement la fonction de sortie du journal de débogage avec journalisation et cliquez sur
Facile à créer une application console Python avec Click
Facilement sans serveur avec Python en utilisant Calice
Implémenter des sous-commandes avec l'argparse de Python
Gérez facilement les listes avec python + sqlite3
Publiez facilement sur Twitter avec Python 3
Implémentez facilement la recherche incrémentielle ItemView avec PySide
Téléchargez facilement des mp3 / mp4 avec python et youtube-dl!
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Python avec Go
Twilio avec Python
Astuces de clic Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Vous pouvez facilement créer une interface graphique même avec Python
Premiers pas avec AWS IoT facilement en Python
Communication série avec Python
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Grattage en Python (préparation)
Essayez de gratter avec Python.
Je veux facilement implémenter le délai d'expiration en python
Facilement démonisé avec Supervisor
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Exécutez Python avec VBA
Manipuler yaml avec python
Résolvez AtCoder 167 avec python
Communication série avec python
[Python] Utiliser JSON avec Python
Apprendre Python avec ChemTHEATER 05-1
Implémenter FReLU avec tf.keras
Apprenez Python avec ChemTHEATER
1.1 Premiers pas avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
Méthode Kernel avec Python