Tener opciones en argparse con un guión


154

Quiero tener algunas opciones en el módulo argparse, como --pm-exportcuando intento usarlo como args.pm-exportsi recibiera el error de que no hay atributo pm. ¿Cómo puedo solucionar este problema? ¿Es posible tener -opciones de línea de comando?

Respuestas:


226

Como se indica en los argparsedocumentos :

Para acciones de argumento opcionales, el valor de dest normalmente se infiere de las cadenas de opciones. ArgumentParser genera el valor de dest al tomar la primera cadena de opción larga y eliminar la --cadena inicial . Los -caracteres internos se convertirán en _caracteres para asegurarse de que la cadena sea un nombre de atributo válido

Entonces deberías estar usando args.pm_export.


108

Desafortunadamente, el reemplazo de guión a guión bajo no funciona para argumentos de posición (sin 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, debe usar el primer argumento add_argument()como nombre de atributo y metavarkwarg para 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>])

77
El informe de error de Python relevante: bugs.python.org/issue15125 . argparseutiliza setattry getattr, por lo tanto, los destnombres no tienen que ser dotnombres de atributos válidos . El usuario también puede usar getattr.
hpaulj

55
Yo solo lo haríapositional_arg = getattr( parser, 'positional-arg' )
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
Exactamente lo que necesitaba: lo hice al revés metavary no podía entender por qué no funcionaba. ¡Gracias!
dwanderson

17

Los guiones se convierten en guiones bajos:

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

44
Solo para argumentos opcionales. Los obligatorios para mantener sus guiones, por lo que requieren un guión bajo para que sean accesibles.
n00dle
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.