2009-12-07 8 views
25

Uso del modulo optparse di python Vorrei aggiungere righe di esempio aggiuntive sotto l'output di utilizzo regolare. La mia corrente di uscita help_print() appare così:python optparse, come includere ulteriori informazioni nell'output di utilizzo?

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 

mi piacerebbe includere esempi di utilizzo per i meno * nix utenti alfabetizzati al mio lavoro. Qualcosa del genere:

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 

Come potrei realizzare questo? Quali opzioni optparse consentono? Codice attuale:

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

Migrazione a argparse :-) –

risposta

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

L'impostazione predefinita format_epilog strisce le nuove righe (usa textwrap), quindi si avrebbe bisogno di sovrascrivere format_epilog nel parser come questo.

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 
""") 
... 

Ecco un po 'più in dettaglio.
Se si guarda nel optparse.py nella classe OptionParser c'è un metodo chiamato format_epilog quale è invocato il format_help

qui è la frammento 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) 

Il comportamento predefinito di formatter.format_epilog è usare textwrap.fill che, tra le altre cose, le strisce newlines dal epilog. Dal momento che vogliamo che le nuove righe da conservare, siamo sottoclasse OptionParser e modificare il comportamento di format_epilog

+0

Grazie mille, è fantastico, dal momento che non è documentato sulla pagina optparse. – Tordek

+0

Questo sarà il mio primo script non bash quindi scusate il mio n00bness. E se volessi tre o quattro righe di epilogo? – CarpeNoctem

+0

Solo 3 righe extra, ho modificato la mia risposta –

5

Utilizzare il parametro usage:

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

è possibile aggiungere più attraverso (solo un esempio):

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) 

Esempio di uscita:

utilizzo : [opzioni] arg1 arg2

opzioni: -h, --help Mostra questo messaggio di aiuto ed esce
-v, --verbose fare un sacco di rumore [Default]
-q, --quiet essere tranquillo vewwy (sto caccia wabbits)
-fFILE, --file = FILE uscita scrive su FILE
-mMODE, --mode = modalità di interazione MODE: uno 'novizio', 'intermedio', [default], 'esperto'

pericoloso Opzioni: Attenzione: l'uso di queste opzioni è a proprio rischio. Si ritiene che lo morda alcuni di loro. -g Opzione di gruppo.

Dai un'occhiata allo here.

+0

Grazie per l'aiuto rapido! Cosa succede se volevo che gli esempi comparissero sotto il normale sommario di utilizzo? – CarpeNoctem

+0

Provare OptionGroup ora, grazie! – CarpeNoctem

2

C'è un parametro description che è possibile passare al costruttore OptionParser. Ciò consente di includere testo arbitrario che viene visualizzato dopo usage, ma prima dell'elenco di opzioni.

Vedere 16.4.3.1. Creating the parser.

4

Un'altra idea su come fare questo sarebbe disabilitando il comportamento predefinito per -h e la stampa di una schermata di aiuto, che può includere quello di default :

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() 

Questo è fondamentalmente ciò che il parser fa con il comportamento predefinito di add_help_option=True, escludendo ovviamente i print s.

Ma, in tutta onestà, preferirei anche un modo per aggiungere semplicemente un determinato numero di righe descrittive all'inizio e alla fine.

11

Sviluppando la risposta vincente (che mi ha aiutato a risolvere lo stesso problema nel mio codice), un'opzione quick-and-dirty è quello di sovrascrivere direttamente il metodo della classe con un metodo d'identità:

optparse.OptionParser.format_epilog = lambda self, formatter: self.epilog 
optparser = optparse.OptionParser(epilog=helptext) 

a ottenere il testo della guida stampato come un epilogo letterale.

Penso che questo sovrascriva la formattazione dell'epilog per tutti gli usi della classe OptionParser nel programma, tuttavia, quindi tutti questi epilog devono essere passati in parola dove si usa OptionParser altrove nel programma.

0

I sottoclasse IndentedHelpFormatter, ed era piuttosto semplice:

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 "" 
Problemi correlati