Tener opciones en argparse con un guión

Resuelto Cemre Mengü asked hace 12 años • 6 respuestas

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

Cemre Mengü avatar Oct 11 '12 14:10 Cemre Mengü
Aceptado

De los argparsedocumentos :

Para acciones de argumentos opcionales, el valor de destnormalmente se infiere de las cadenas de opciones. ArgumentParsergenera el valor de desttomando 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.

Thomas Orozco avatar Oct 11 '2012 08:10 Thomas Orozco

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 metavarkwarg 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'>)
seriyPS avatar Nov 27 '2013 18:11 seriyPS

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')
georg avatar Oct 11 '2012 08:10 georg

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'])
Denis The Menace avatar Nov 13 '2020 16:11 Denis The Menace