Próbuję przekazać listę argumentów do skryptu Pythona przy użyciu biblioteki argh. Coś, co może wejść, takie jak:python argh/argparse: Jak mogę przekazać listę jako argument wiersza poleceń?
./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
Mój wewnętrzny kod wygląda następująco:
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()
A oto jak się zachowuje:
$ 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
Problem wydaje się dość prosta: argh jest akceptuje tylko pierwszy argument i traktuje go jako ciąg znaków. Jak mogę "oczekiwać" listy liczb całkowitych?
Widzę how this is done in optparse, ale co z (nie-przestarzałym) argparse? Lub używając znacznie ładniej udekorowanej składni argha? Te wydają się znacznie bardziej pythonic.
Awesome! Poprawiłem kod, dodając linię: @ argh.arg ('- argB', default = [], help = 'Argument typu listy - z tym że nie jest!', Nargs = '+', type = int) i argh polubili to. Dzięki za pomoc! – Abe
Tak, to jest poprawna metoda. Najnowsze wersje Argh również obsługują "naturalną", bardziej pytonową notację: 'func (argA, * argB)' (chociaż '* args' mapuje na' nargs = '*' 'zamiast' nargs = '+' ') . –
@jcollado: Widzę, że kiedy używam nargs =, nie mogę zrobić -a = 1 2 3. Mam na myśli to, że używam "=" po argumencie metavar. Każde rozwiązanie pozwalające mi używać = dla każdego argumentu. Na przykład w twoim przykładzie chcę, python test.py main -a = 1 2 3 –