2012-02-22 72 views
57

Tôi đang cố chuyển một danh sách các đối số tới một tập lệnh python bằng cách sử dụng thư viện argh. Cái gì mà có thể mất đầu vào như thế này:python argh/argparse: Làm cách nào để chuyển danh sách dưới dạng đối số dòng lệnh?

./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ã nội bộ của tôi trông như thế này:

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() 

Và đây là cách ứng xử:

$ 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 

Vấn đề có vẻ khá đơn giản: argh là chỉ chấp nhận đối số đầu tiên và coi nó là một chuỗi. Làm thế nào để làm cho nó "mong đợi" một danh sách các số nguyên thay thế?

Tôi thấy how this is done in optparse, nhưng điều gì về (không được chấp nhận) argparse? Hoặc sử dụng cú pháp trang trí đẹp hơn nhiều của argh? Những thứ này dường như có nhiều chất pythonic hơn.

Trả lời

76

Với argparse, bạn chỉ cần sử dụng type=int

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('-a', '--arg', nargs='+', type=int) 
print parser.parse_args() 

đầu ra Ví dụ:

$ python test.py -a 1 2 3 
Namespace(arg=[1, 2, 3]) 

Chỉnh sửa: Tôi không quen thuộc với argh, nhưng nó có vẻ là chỉ là một wrapper quanh argparse và điều này đã làm việc cho tôi:

import argh 

@argh.arg('-a', '--arg', nargs='+', type=int) 
def main(args): 
    print args 

parser = argh.ArghParser() 
parser.add_commands([main]) 
parser.dispatch() 

Ví dụ đầu ra:

$ python test.py main -a 1 2 3 
Namespace(arg=[1, 2, 3], function=<function main at 0x.......>) 
+1

Tuyệt vời! Tôi chỉnh sửa mã để bao gồm các dòng: @ argh.arg ('- argB', mặc định = [], help = 'Một danh sách kiểu arg - ngoại trừ nó \' s không! ', Nargs =' + ', type = int) và argh thích nó. Cảm ơn đã giúp đỡ! – Abe

+0

Đúng, đây là cách chính xác. Các phiên bản gần đây của Argh cũng hỗ trợ ký hiệu "tự nhiên", nhiều ký tự: 'func (argA, * argB)' (mặc dù '* args' ánh xạ tới' nargs = '*' 'thay vì' nargs = '+' ') . –

+0

@jcollado: Tôi thấy rằng khi tôi sử dụng nargs =, tôi không thể làm -a = 1 2 3. Ý tôi là sử dụng '=' sau đối số metavar. Bất kỳ giải pháp để cho tôi sử dụng = cho mỗi arg. Ví dụ trong ví dụ của bạn tôi muốn làm, python test.py main -a = 1 2 3 –

1

Tôi có quyền truy cập vào từng giá trị tham số, mã sau có thể hữu ích.

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]) 
Các vấn đề liên quan