In Qiitas Kommentar habe ich den eingeführten Klick überprüft und festgestellt, dass es einfach ist, Unterbefehle zu implementieren. Daher werde ich zusammenfassen, wie das geht. Ein Unterbefehl ist ein Befehl, bei dem das erste Argument des Skripts ein Befehl ist, der in Versionsverwaltungsbefehlen wie git und svn sowie in djangos Projektverwaltungsskript manage.py enthalten ist.
click ist kein Standard-Python-Paket, installieren Sie es also mit pip.
$ pip install click
Der Basiscode sieht folgendermaßen aus:
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 ist die Startfunktion für alles, und Unterbefehl1 und Unterbefehl2 sind die Implementierungen der Unterbefehle. Geben Sie jede Beschreibung als Hilfevariable in @ cli.command ein. Im Folgenden wird der Inhalt der angezeigten Befehlshilfe angezeigt.
Usage: sample.py [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
subcommand1 description 1
subcommand2 description 2
Sie können sehen, dass die Unterbefehle 1 und 2 in den Befehlen registriert sind.
Tips
(Sub) Der Befehlsname ist möglicherweise zu lang und Sie möchten möglicherweise einen Verknüpfungsbefehl erstellen. Erweitern Sie in diesem Fall die Gruppenklasse und implementieren Sie sie.
...
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):
...
Wie oben erwähnt, geben Sie die AliasedGroup an, die als cls-Argument von @ click.group implementiert ist. Dann
$ python ./sample.py shortcut
gonna invoke shortcut
sub command 1
Die Implementierung von sabcommand1 funktioniert wie oben.
Wenn Sie sich in mehrere Dateien aufteilen und Unterbefehle implementieren möchten, können Sie den Befehl implementieren und der Gruppe hinzufügen.
@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)
Sobald ich es versuche, möchte ich die Implementierung von verketteten Befehlen einführen.
Recommended Posts