argumentparser - parser python example
Python optparse, ¿cómo incluir información adicional en la salida de uso? (6)
Usando el módulo optparse de python, me gustaría agregar líneas de ejemplo adicionales debajo de la salida de uso regular. Mi salida actual de help_print () se ve así:
usage: check_dell.py [options]
options:
-h, --help show this help message and exit
-s, --storage checks virtual and physical disks
-c, --chassis checks specified chassis components
Me gustaría que incluyera ejemplos de uso para los usuarios menos alfabetizados * * de mi trabajo. Algo como esto:
usage: check_dell.py [options]
options:
-h, --help show this help message and exit
-s, --storage checks virtual and physical disks
-c, --chassis checks specified chassis components
Examples:
check_dell -c all
check_dell -c fans memory voltage
check_dell -s
¿Cómo lograría esto? ¿Qué opciones optparse permiten tal? Código actual:
import optparse
def main():
parser = optparse.OptionParser()
parser.add_option(''-s'', ''--storage'', action=''store_true'', default=False, help=''checks virtual and physical disks'')
parser.add_option(''-c'', ''--chassis'', action=''store_true'', default=False, help=''checks specified chassis components'')
(opts, args) = parser.parse_args()
Al elaborar la respuesta ganadora (que me ayudó a resolver el mismo problema en mi propio código), una opción rápida y sucia es anular directamente el método de la clase con un método de identidad:
optparse.OptionParser.format_epilog = lambda self, formatter: self.epilog
optparser = optparse.OptionParser(epilog=helptext)
para obtener texto de ayuda impreso como un epílogo textual.
Sin embargo, creo que esto anula el formato de epílogo para todos los usos de la clase OptionParser en su programa, por lo que todos los epílogos de este tipo deben pasarse literalmente cuando se usa OptionParser en otra parte de su programa.
Hay un parámetro de description
que puede pasar al constructor OptionParser
. Esto le permite incluir texto arbitrario que aparece después del usage
, pero antes de la lista de opciones.
Otra idea sobre cómo hacer esto sería deshabilitar el comportamiento predeterminado para -h
e imprimir su propia pantalla de ayuda, que puede incluir la predeterminada:
from optparse import OptionParser
parser = OptionParser(add_help_option=False,
epilog="This can''t be easily/n multilined")
parser.add_option(''-h'', ''--help'', dest=''help'', action=''store_true'',
help=''show this help message and exit'')
(options, args) = parser.parse_args()
if options.help:
parser.print_help()
print ''now we have an epilog''
print ''with as many lines as you wish''
sys.exit()
Eso es básicamente lo que hace el analizador con el comportamiento predeterminado de add_help_option=True
, excluyendo, por supuesto, las print
.
Pero, con toda honestidad, también preferiría una manera de simplemente agregar cualquier número dado de líneas de descripción al principio y al final.
Subclasificé IndentedHelpFormatter, y fue bastante simple:
class PlainHelpFormatter(optparse.IndentedHelpFormatter):
def format_description(self, description):
if description:
return description + "/n"
else:
return ""
def format_epilog(self, epilog):
if epilog:
return epilog + "/n"
else:
return ""
Utilice el parámetro de usage
:
usage = "usage: %prog [options] arg1 arg2"
parser = OptionParser(usage=usage)
Puedes agregar más a través (solo un ejemplo):
group = OptionGroup(parser, "Dangerous Options",
"Caution: use these options at your own risk. "
"It is believed that some of them bite.")
group.add_option("-g", action="store_true", help="Group option.")
parser.add_option_group(group)
Ejemplo de salida:
uso: [opciones] arg1 arg2
opciones: -h, --help muestra este mensaje de ayuda y sale
-v, --verbose hace mucho ruido [por defecto]
-q, --quiet be vewwy quiet (estoy cazando wabbits)
-fFILE, --file = ARCHIVO escribe la salida en el ARCHIVO
-mMODE, --mode = Modo de interacción MODE: uno de ''novato'', ''intermedio'', [predeterminado], ''experto''Opciones peligrosas: Precaución: el uso de estas opciones es bajo su propio riesgo. Se cree que algunos de ellos muerden. -g opción de grupo.
Echa un vistazo here .
parser = optparse.OptionParser(epilog="otherstuff")
El format_epilog
predeterminado format_epilog
las líneas nuevas (usa textwrap), por lo que necesitarías anular format_epilog
en tu analizador de esta manera.
def main():
class MyParser(optparse.OptionParser):
def format_epilog(self, formatter):
return self.epilog
parser =MyParser(epilog=
"""Examples:
check_dell -c all
check_dell -c fans memory voltage
check_dell -s
""")
...
Aquí hay un poco más de detalle.
Si observa optparse.py
en la clase OptionParser
existe un método llamado format_epilog
que llama format_help
Aquí está el fragmento de optparse.py
def format_epilog(self, formatter):
return formatter.format_epilog(self.epilog)
def format_help(self, formatter=None):
if formatter is None:
formatter = self.formatter
result = []
if self.usage:
result.append(self.get_usage() + "/n")
if self.description:
result.append(self.format_description(formatter) + "/n")
result.append(self.format_option_help(formatter))
result.append(self.format_epilog(formatter))
return "".join(result)
El comportamiento predeterminado de formatter.format_epilog
es usar textwrap.fill
que, entre otras cosas, elimina las nuevas líneas del epílog. Como queremos que se conserven las nuevas líneas, subclasificamos OptionParser
y cambiamos el comportamiento de format_epilog