Python Language
Sottocomandi CLI con output di aiuto preciso
Ricerca…
introduzione
Diversi modi per creare sottocomandi come in hg
o svn
con l'esatta interfaccia a riga di comando e l'output di aiuto come mostrato nella sezione Commenti.
L'analisi degli argomenti della riga di comando copre argomenti più ampi di analisi degli argomenti.
Osservazioni
Diversi modi per creare sottocomandi come in hg
o svn
con l'interfaccia a riga di comando mostrata nel messaggio di aiuto:
usage: sub <command>
commands:
status - show status
list - print list
Modo nativo (senza librerie)
"""
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())
Uscita senza argomenti:
usage: sub <command>
commands:
status - show status
list - print list
Professionisti:
- no deps
- tutti dovrebbero essere in grado di leggerlo
- controllo completo sulla formattazione della guida
argparse (formattatore di aiuto predefinito)
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())
Uscita senza argomenti:
usage: sub {status,list} ...
positional arguments:
{status,list}
status show status
list print list
Professionisti:
- viene fornito con Python
- l'analisi delle opzioni è inclusa
argparse (formattatore di aiuto personalizzato)
Versione estesa di http://www.Scriptutorial.com/python/example/25282/argparse--default-help-formatter- che ha risolto l'output della guida.
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())
Uscita senza argomenti:
usage: sub <command>
commands:
status - show status
list - print list
Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow