2012-10-11 20 views
70

Voglio avere alcune opzioni nel modulo argparse come --pm-export tuttavia quando provo ad usarlo come args.pm-export ottengo l'errore che non c'è attributo pm. Come posso aggirare questo problema? È possibile avere - nelle opzioni della riga di comando?Avere opzioni in argparse con un trattino

risposta

90

Come indicated in the argparse docs:

Per le azioni di argomenti opzionali, il valore di dest è normalmente dedotte da stringhe di opzione. ArgumentParser genera il valore di dest prendendo la prima stringa di opzioni lunghe e stripping della stringa -- iniziale. Qualsiasi interne - caratteri verranno convertiti in caratteri _ per assicurarsi che la stringa è un nome di attributo valido

Quindi si dovrebbe utilizzare args.pm_export.

13

trattini vengono convertiti in sottolineature:

import argparse 
pa = argparse.ArgumentParser() 
pa.add_argument('--foo-bar') 
args = pa.parse_args(['--foo-bar', '24']) 
print args # Namespace(foo_bar='24') 
+2

Solo per argomenti facoltativi. Quelli necessari per mantenere i trattini, quindi richiedono un trattino basso per renderli accessibili. – n00dle

54

Purtroppo, trattino-a-sottolineatura sostituzione non funziona per positionalarguments (non preceduti da --) come

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('logs-dir', 
        help='Directory with .log and .log.gz files') 
parser.add_argument('results-csv', type=argparse.FileType('w'), 
        default=sys.stdout, 
        help='Output .csv filename') 
args = parser.parse_args() 
print args 

# gives 
# Namespace(logs-dir='./', results-csv=<open file 'lool.csv', mode 'w' at 0x9020650>) 

Quindi, è necessario utilizzare l'argomento 1'st per add_argument() come nome dell'attributo e metavar kwarg a impostare come dovrebbe apparire in help:

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('logs_dir', metavar='logs-dir', 
        nargs=1, 
        help='Directory with .log and .log.gz files') 
parser.add_argument('results_csv', metavar='results-csv', 
        nargs=1, 
        type=argparse.FileType('w'), 
        default=sys.stdout, 
        help='Output .csv filename') 
args = parser.parse_args() 
print args 

# gives 
# Namespace(logs_dir=['./'], results_csv=[<open file 'lool.csv', mode 'w' at 0xb71385f8>]) 
+4

Il rapporto bug relativo a Python: http://bugs.python.org/issue15125. 'argparse' usa' setattr' e 'getattr', quindi i nomi' dest' non devono essere validi nomi attributo 'punto'. L'utente può anche usare 'getattr'. – hpaulj

+3

Mi piacerebbe fare 'positional_arg = getattr (parser, 'positional-arg')' –

+0

Esattamente quello di cui avevo bisogno - Ho fatto il backward con 'metavar' e non riuscivo a capire perché non funzionava. Grazie! – dwanderson

Problemi correlati