如何使用argparse

时间:2017-04-22 09:25:16

标签: python argparse

我有这样的功能

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

def square(a):
    print a**2

现在我使用argparse为这个函数定义linux命令(选项)。

我尝试使用此代码

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

1 个答案:

答案 0 :(得分:1)

--addoptionals flag的形式,add是subparser名称的正确形式

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)提供了更多信息。请注意,subparser名称现在可用作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