Python Language
Sous-commandes CLI avec sortie d'aide précise
Recherche…
Introduction
Différentes manières de créer des sous-commandes comme dans hg
ou svn
avec l'interface de ligne de commande exacte et les résultats d'aide, comme indiqué dans la section Remarques.
L'analyse des arguments de la ligne de commande couvre un sujet plus large d'analyse des arguments.
Remarques
Différentes manières de créer des sous-commandes comme dans hg
ou svn
avec l'interface de ligne de commande affichée dans le message d'aide:
usage: sub <command>
commands:
status - show status
list - print list
Façon native (pas de bibliothèques)
"""
usage: sub <command>
commands:
status - show status
list - print list
"""
import sys
def check():
print("status")
return 0
if sys.argv[1:] == ['status']:
sys.exit(check())
elif sys.argv[1:] == ['list']:
print("list")
else:
print(__doc__.strip())
Sortie sans arguments:
usage: sub <command>
commands:
status - show status
list - print list
Avantages:
- pas de deps
- tout le monde devrait pouvoir lire cela
- contrôle complet du formatage de l'aide
argparse (formateur d'aide par défaut)
import argparse
import sys
def check():
print("status")
return 0
parser = argparse.ArgumentParser(prog="sub", add_help=False)
subparser = parser.add_subparsers(dest="cmd")
subparser.add_parser('status', help='show status')
subparser.add_parser('list', help='print list')
# hack to show help when no arguments supplied
if len(sys.argv) == 1:
parser.print_help()
sys.exit(0)
args = parser.parse_args()
if args.cmd == 'list':
print('list')
elif args.cmd == 'status':
sys.exit(check())
Sortie sans arguments:
usage: sub {status,list} ...
positional arguments:
{status,list}
status show status
list print list
Avantages:
- est livré avec Python
- l'analyse des options est incluse
argparse (formateur d'aide personnalisée)
Version étendue de http://www.riptutorial.com/python/example/25282/argparse--default-help-formatter- cette sortie d'aide fixe.
import argparse
import sys
class CustomHelpFormatter(argparse.HelpFormatter):
def _format_action(self, action):
if type(action) == argparse._SubParsersAction:
# inject new class variable for subcommand formatting
subactions = action._get_subactions()
invocations = [self._format_action_invocation(a) for a in subactions]
self._subcommand_max_length = max(len(i) for i in invocations)
if type(action) == argparse._SubParsersAction._ChoicesPseudoAction:
# format subcommand help line
subcommand = self._format_action_invocation(action) # type: str
width = self._subcommand_max_length
help_text = ""
if action.help:
help_text = self._expand_help(action)
return " {:{width}} - {}\n".format(subcommand, help_text, width=width)
elif type(action) == argparse._SubParsersAction:
# process subcommand help section
msg = '\n'
for subaction in action._get_subactions():
msg += self._format_action(subaction)
return msg
else:
return super(CustomHelpFormatter, self)._format_action(action)
def check():
print("status")
return 0
parser = argparse.ArgumentParser(usage="sub <command>", add_help=False,
formatter_class=CustomHelpFormatter)
subparser = parser.add_subparsers(dest="cmd")
subparser.add_parser('status', help='show status')
subparser.add_parser('list', help='print list')
# custom help messge
parser._positionals.title = "commands"
# hack to show help when no arguments supplied
if len(sys.argv) == 1:
parser.print_help()
sys.exit(0)
args = parser.parse_args()
if args.cmd == 'list':
print('list')
elif args.cmd == 'status':
sys.exit(check())
Sortie sans arguments:
usage: sub <command>
commands:
status - show status
list - print list
Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow