2017-04-22 52 views
2

我有这样如何使用申请的功能选项argparse

def add(x,y): 
    print x+y 

def square(a): 
    print a**2 

现在我定义的Linux命令(选项)使用argparse此功能的作用。

我试着用这个代码

import argparse 
# Create Parser and Subparser 
parser = argparse.ArgumentParser(description="Example ArgumentParser") 
subparser = parser.add_subparsers(help="commands") 

# Make Subparsers 
add_parser = subparser.add_parser('--add', help="add func") 
add_parser.add_argument("x",type=float,help='first number') 
add_parser.add_argument("y",type=float,help='second number') 
add_parser.set_defaults(func='add') 

square_parser = subparser.add_parser('--square', help="square func") 
square_parser.add_argument("a",type=float,help='number to square') 
square_parser.set_defaults(func='square') 

args = parser.parse_args() 


def add(x,y): 
    print x + y 

def square(a): 
    print a**2 

if args.func == '--add': 
    add(args.x,args.y) 
if args.func == '--square': 
    square(args.a) 

但我得到的错误,同时通过命令python code.py --add 2 3

invalid choice: '2' (choose from '--add', '--square') 
+0

删除 - 从子分析器名称“” 。只使用'添加'。它们不应该看起来像是可选项的标志。还请查看有关使用带有子分析器的'setdefaults'的文档。 – hpaulj

回答

1

--addoptionals flag的形式,add是一个子分析器名字的正确形式

import argparse 
# Create Parser and Subparser 
parser = argparse.ArgumentParser(description="Example ArgumentParser") 
subparser = parser.add_subparsers(dest='cmd', help="commands") 

# Make Subparsers 
add_parser = subparser.add_parser('add', help="add func") 
add_parser.add_argument("x",type=float,help='first number') 
add_parser.add_argument("y",type=float,help='second number') 
add_parser.set_defaults(func='add') 

square_parser = subparser.add_parser('square', help="square func") 
square_parser.add_argument("a",type=float,help='number to square') 
square_parser.set_defaults(func='square') 

args = parser.parse_args() 
print(args) 

def add(x,y): 
    print x + y 

def square(a): 
    print a**2 

if args.func == 'add': # if args.cmd=='add': also works 
    add(args.x,args.y) 
if args.func == 'square': 
    square(args.a) 

产生

0950:~/mypy$ python stack43557510.py add 2 3 
Namespace(cmd='add', func='add', x=2.0, y=3.0) 
5.0 

我添加dest='cmd'add_subparsers命令,print(args),得到更多的信息。请注意,子分析器名称现在可作为args.cmd。所以你不需要添加func

然而argparse文档办提出一种替代使用set_defaults

https://docs.python.org/3/library/argparse.html#sub-commands

add_parser.set_defaults(func=add) 

有了这个args.func实际上是一个函数对象,不只是一个字符串名称。因此,它可以被用来作为

args.func(args) 

注意,我不得不改变的功能如何处理它们的参数:

def add(args): 
    print(args.x + args.y) 

def square(args): 
    print(args.a**2) 

# Create Parser and Subparser 
parser = argparse.ArgumentParser(description="Example ArgumentParser") 
subparser = parser.add_subparsers(dest='cmd', help="commands") 

# Make Subparsers 
add_parser = subparser.add_parser('add', help="add func") 
add_parser.add_argument("x",type=float,help='first number') 
add_parser.add_argument("y",type=float,help='second number') 
add_parser.set_defaults(func=add) 

square_parser = subparser.add_parser('square', help="square func") 
square_parser.add_argument("a",type=float,help='number to square') 
square_parser.set_defaults(func=square) 

args = parser.parse_args() 
print(args) 

args.func(args) 

生产

1001:~/mypy$ python stack43557510.py add 2 3 
Namespace(cmd='add', func=<function add at 0xb73fd224>, x=2.0, y=3.0) 
5.0