2012-11-16 3 views
8

Sto usando il modulo argparse Python per i sottocomandi della riga di comando nel mio programma. Il mio codice è fondamentalmente come questo:Sottodirectory Argparse: nascondi il metavar nel comando che elenca

import argparse 

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(title="subcommands", metavar="<command>") 

subparser = subparsers.add_parser("this", help="do this") 
subparser = subparsers.add_parser("that", help="do that") 

parser.parse_args() 

Durante l'esecuzione di "python test.py --help" Vorrei elencare i sottocomandi disponibili. Attualmente ottengo questo output:

usage: test.py [-h] <command> ... 

optional arguments: 
    -h, --help show this help message and exit 

subcommands: 
    <command> 
    this  do this 
    that  do that 

Posso in qualche modo rimuovere la riga <command> nei sottocomandi quotazione e ancora tenerlo in linea di utilizzo? Ho cercato di dare help = argparse.SUPPRESS come argomento per add_subparsers, ma che nasconde semplicemente tutti i sottocomandi nell'output della guida.

+0

Cosa sull'impostazione 'a' metavar' none' (o lasciarlo fuori)? - O impostazione 'metavar = ''' ... – mgilson

+0

Grazie per aver risposto! Se lo imposto su None, ottengo invece solo una lista di tutti i comandi e se utilizzo 'metavar = ''' Ricevo una riga vuota. In entrambi i casi, perdo la metavar nella riga di utilizzo. –

+0

Oh, ottengo quello che stai cercando ora. Sfortunatamente non so come farlo accadere. – mgilson

risposta

10

ho risolto con l'aggiunta di un nuovo HelpFormatter che rimuove solo la linea se la formattazione di un'azione di parser:

class SubcommandHelpFormatter(argparse.RawDescriptionHelpFormatter): 
    def _format_action(self, action): 
     parts = super(argparse.RawDescriptionHelpFormatter, self)._format_action(action) 
     if action.nargs == argparse.PARSER: 
      parts = "\n".join(parts.split("\n")[1:]) 
     return parts 
+0

Soluzione eccezionale. +1 per risolvere un problema irritante in modo semplice. – Christopher

+0

Grazie per il metodo. Funziona come previsto se aggiunto a: 'argparse.ArgumentParser (formatter_class = SubcommandHelpFormatter)' –