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