parser example argumentparser python optparse

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.

Ver 16.4.3.1. Creando el analizador .


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