por - python argh/argparse: ¿Cómo puedo pasar una lista como un argumento de línea de comandos?
ejecutar script python con parametros (2)
Con argparse
, solo usas type=int
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(''-a'', ''--arg'', nargs=''+'', type=int)
print parser.parse_args()
Ejemplo de salida:
$ python test.py -a 1 2 3
Namespace(arg=[1, 2, 3])
Editar: No estoy familiarizado con argh
, pero parece ser solo una envoltura alrededor de argparse
y esto funcionó para mí:
import argh
@argh.arg(''-a'', ''--arg'', nargs=''+'', type=int)
def main(args):
print args
parser = argh.ArghParser()
parser.add_commands([main])
parser.dispatch()
Ejemplo de salida:
$ python test.py main -a 1 2 3
Namespace(arg=[1, 2, 3], function=<function main at 0x.......>)
Estoy tratando de pasar una lista de argumentos a un script de Python usando la librería argh. Algo que puede tomar entradas como estas:
./my_script.py my-func --argA blah --argB 1 2 3 4
./my_script.py my-func --argA blah --argB 1
./my_script.py my-func --argA blah --argB
Mi código interno se ve así:
import argh
@argh.arg(''--argA'', default="bleh", help=''My first arg'')
@argh.arg(''--argB'', default=[], help=''A list-type arg--except it/'s not!'')
def my_func(args):
"A function that does something"
print args.argA
print args.argB
for b in args.argB:
print int(b)*int(b) #Print the square of each number in the list
print sum([int(b) for b in args.argB]) #Print the sum of the list
p = argh.ArghParser()
p.add_commands([my_func])
p.dispatch()
Y así es como se comporta:
$ python temp.py my-func --argA blooh --argB 1
blooh
[''1'']
1
1
$ python temp.py my-func --argA blooh --argB 10
blooh
[''1'', ''0'']
1
0
1
$ python temp.py my-func --argA blooh --argB 1 2 3
usage: temp.py [-h] {my-func} ...
temp.py: error: unrecognized arguments: 2 3
El problema parece bastante sencillo: argh solo acepta el primer argumento y lo trata como una cadena. ¿Cómo puedo hacer que "espere" una lista de enteros en su lugar?
Veo cómo se hace esto en optparse , pero ¿qué pasa con la argparse (no desaprobada)? ¿O usando la sintaxis decorada mucho más bonita de argh? Estos parecen mucho más pitonicos.
Ordeno tener acceso a cada valor de parámetro, el siguiente código puede ser útil.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(''-a'', ''--arg'', nargs=''+'', type=int)
args = vars(parser.parse_args())
print "first parameter:" + str(args["arg"][0])
print "second parameter:" + str(args["arg"][1])
print "third parameter:" + str(args["arg"][2])