2012-10-11 19 views
70

Quiero tener algunas opciones en el módulo argparse como --pm-export, sin embargo, cuando trato de usarlo como args.pm-export me sale el error de que no existe el atributo pm. ¿Cómo puedo evitar este problema? ¿Es posible tener - en opciones de línea de comando?Tener opciones en argparse con un guión

Respuesta

90

Como indicated in the argparse docs:

Para las acciones argumento opcional, el valor de dest normalmente se infiere de las cadenas de opciones. ArgumentParser genera el valor de dest tomando la primera cadena de opción larga y quitando la cadena -- inicial. Cualquier - caracteres internos se convertirán en personajes _ para asegurarse de que la cadena es un nombre de atributo válido

Por lo tanto usted debe utilizar args.pm_export.

13

Los guiones se convierten en rayas:

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 para argumentos opcionales. Los necesarios para mantener sus guiones, por lo que requieren un guión bajo para que sean accesibles. – n00dle

54

Desafortunadamente, Dash-a-guión de reemplazo no funciona para positionalarguments (no el prefijo --) como

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

Por lo tanto, se debe utilizar el argumento 1'st a add_argument() como nombre de atributo y metavar kwarg a establecer cómo debería verse en la ayuda:

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

El informe de error de Python correspondiente: http://bugs.python.org/issue15125. 'argparse' utiliza' setattr' y 'getattr', por lo que los nombres' dest' no tienen que ser nombres de atributo 'dot' válidos. El usuario también puede usar 'getattr'. – hpaulj

+3

Me gustaría hacer 'positional_arg = getattr (analizador, 'posicional-arg')' –

+0

Exactamente lo que necesitaba - Lo hice al revés con 'metavar' y no pude entender por qué no estaba funcionando. ¡Gracias! – dwanderson

Cuestiones relacionadas