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?

Cemre
fuente

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.

Thomas Orozco
fuente
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>])
SERIPS
fuente
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')
georg
fuente
44
Solo para argumentos opcionales. Los obligatorios para mantener sus guiones, por lo que requieren un guión bajo para que sean accesibles.
n00dle