2009-12-07 6 views
25

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 de corriente help_print() tiene el siguiente aspecto:python optparse, ¿cómo incluir información adicional en el resultado de uso?

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 incluir ejemplos de uso para los usuarios menos * nix leer y escribir en 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 puedo lograr esto? ¿Qué opciones de optparse permiten tales? 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() 
+0

Migrar a argparse :-) –

Respuesta

39
parser = optparse.OptionParser(epilog="otherstuff") 

El valor predeterminado format_epilog tiras de los saltos de línea (se utiliza TextWrap), por lo que tendría que anular format_epilog en su 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 nos fijamos en optparse.py en la clase OptionParser hay un método llamado format_epilog que es llamada por format_help

aquí es 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 utilizar textwrap.fill que, entre otras cosas, las tiras de las nuevas líneas del epílogo. Como queremos que las nuevas líneas que se conservan, que subclase OptionParser y cambiar el comportamiento de format_epilog

+0

Muchas gracias, es increíble, ya que no está documentado en la página de optparse. – Tordek

+0

Este será mi primer script que no sea bash así que disculpe mi n00bness. ¿Qué pasa si quiero tres o cuatro líneas de epilog? – CarpeNoctem

+0

Solo 3 líneas extra, he editado mi respuesta –

5

Utilice el usage parámetro:

usage = "usage: %prog [options] arg1 arg2" 
parser = OptionParser(usage=usage) 

puede agregar más a través (es 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 mostrar este mensaje y salida
-v ayuda, --verbose hacer mucho ruido [por defecto]
-q, --quiet estar tranquilos vewwy (estoy wabbits caza)
-fFILE, --file = salida de escritura archivo a archivo
-mMODE, --mode = modo de interacción MODE: uno de 'novato', 'intermedia', [predeterminado], 'experto'

Dangerous Opciones: Precaución: uso de estas opciones es bajo su propio riesgo. Es se cree que algunos de ellos muerden. -g Opción grupal.

Echa un vistazo here.

+0

Gracias por la ayuda rápida! ¿Qué sucede si quiero que los ejemplos aparezcan debajo del resumen de uso habitual? – CarpeNoctem

+0

Probando OptionGroup ahora, ¡gracias! – CarpeNoctem

2

Hay un parámetro description que puede pasar al constructor OptionParser. Esto le permite incluir texto arbitrario que aparece después de usage, pero antes de la lista de opciones.

Ver 16.4.3.1. Creating the parser.

4

Otra idea sobre la forma de hacer esto sería incapacitante el comportamiento predeterminado de -h e imprimir su propia pantalla de ayuda, que puede incluir el valor predeterminado :

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 que el analizador con el comportamiento predeterminado de add_help_option=True, excluyendo, por supuesto, los print s.

Pero, honestamente, también preferiría una manera de simplemente agregar cualquier número dado de líneas de descripción al principio y al final.

11

Abundando en la respuesta ganadora (que me ayudó a resolver el mismo problema en mi propio código), una opción rápida y sucio es reemplazar 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) 

a obtener texto de ayuda impreso como un epílogo literal.

Creo que esto anula el formato epilog para todos los usos de la clase OptionParser en su programa, por lo que todos los epilogs se deben pasar literalmente donde se usa OptionParser en otro lugar de su programa.

0

I subclases IndentedHelpFormatter, y era 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 "" 
Cuestiones relacionadas