Tener opciones en argparse con un guión
Quiero tener algunas opciones en el módulo argparse, como por --pm-export
ejemplo, cuando intento usarlo, args.pm-export
aparece el error de que no hay atributo pm
. ¿Cómo puedo solucionar este problema? ¿ Es posible tener -
opciones en la línea de comando?
De los argparse
documentos :
Para acciones de argumentos opcionales, el valor de
dest
normalmente se infiere de las cadenas de opciones.ArgumentParser
genera el valor dedest
tomando la primera cadena de opción larga y eliminando la--
cadena inicial. Todos-
los caracteres internos se convertirán en_
caracteres para garantizar que la cadena sea un nombre de atributo válido.
Entonces deberías usar args.pm_export
.
Desafortunadamente, el reemplazo de guión por guión bajo no funciona para argumentos posicionales (argumentos sin el prefijo --
). Por ejemplo:
import argparse
import sys
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)
# Namespace(**{'logs-dir': './', 'results-csv': <_io.TextIOWrapper name='mydata.csv' mode='w' encoding='UTF-8'>})
Por lo tanto, debes usar el primer argumento para add_argument()
el nombre del atributo y pasar un metavar
kwarg para establecer cómo se debe mostrar en la ayuda:
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('logs_dir', metavar='logs-dir',
help='Directory with .log and .log.gz files')
parser.add_argument('results_csv', metavar='results-csv',
type=argparse.FileType('w'),
default=sys.stdout,
help='Output .csv filename')
args = parser.parse_args()
print(args)
# Namespace(logs_dir='./', results_csv=<_io.TextIOWrapper name='mydata.csv' mode='w' encoding='UTF-8'>)
Los guiones se convierten en guiones bajos:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo-bar')
args = parser.parse_args(['--foo-bar', '24'])
print(args) # Namespace(foo_bar='24')
Una forma concisa y explícita, pero probablemente no siempre aceptable, sería utilizar vars()
:
#!/usr/bin/env python3
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('a-b')
args = vars(parser.parse_args())
print(args['a-b'])