Python Language
Subcomandos CLI con salida de ayuda precisa
Buscar..
Introducción
Diferentes formas de crear subcomandos como en hg
o svn
con la interfaz de línea de comandos exacta y la salida de ayuda, como se muestra en la sección Comentarios.
Análisis de los argumentos de la línea de comandos cubre un tema más amplio de análisis de argumentos.
Observaciones
Diferentes formas de crear subcomandos como en hg
o svn
con la interfaz de línea de comandos que se muestra en el mensaje de ayuda:
usage: sub <command>
commands:
status - show status
list - print list
Forma nativa (sin bibliotecas)
"""
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())
Salida sin argumentos:
usage: sub <command>
commands:
status - show status
list - print list
Pros:
- no deps
- todo el mundo debería ser capaz de leer eso
- Control completo sobre el formato de ayuda.
argparse (formateador de ayuda predeterminado)
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())
Salida sin argumentos:
usage: sub {status,list} ...
positional arguments:
{status,list}
status show status
list print list
Pros:
- viene con Python
- Opción de análisis está incluido
argparse (formateador de ayuda personalizado)
Versión extendida de http://www.riptutorial.com/python/example/25282/argparse--default-help-formatter- que solucionó la salida de ayuda.
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())
Salida sin argumentos:
usage: sub <command>
commands:
status - show status
list - print list
Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow