Sto provando a passare una lista di argomenti a uno script python usando la libreria argh. Qualcosa che può prendere gli ingressi come questi:python argh/argparse: come posso passare un elenco come argomento della riga di comando?
./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
Il mio codice interno è simile al seguente:
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()
Ed ecco come si 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
Il problema sembra abbastanza semplice: Argh è accettando solo il primo argomento e trattandolo come una stringa. Come faccio a "aspettarmi" invece una lista di numeri interi?
Vedo how this is done in optparse, ma per quanto riguarda l'argparse (non deprecato)? O usando la sintassi molto più decorata di argh? Questi sembrano molto più pitonici.
Impressionante! Ho ottimizzato il codice per includere la riga: @ argh.arg ('- argB', default = [], help = 'Un argomento di tipo lista - tranne che non \! S!', Nargs = '+', type = int) e argh è piaciuto. Grazie per l'aiuto! – Abe
Sì, questo è il modo corretto. Le versioni recenti di Argh supportano anche la notazione "naturale", più pitonica: 'func (argA, * argB)' (anche se '* args' esegue il mapping a' nargs = '*' 'invece di' nargs = '+' ') . –
@jcollado: vedo che quando uso nargs =, non posso fare -a = 1 2 3. Quello che voglio dire è usare '=' dopo l'argomento metavar. Qualsiasi soluzione per lasciarmi usare = per ogni argomento. Per esempio nel tuo esempio, voglio fare, python test.py main -a = 1 2 3 –