2017-04-22 10 views
2

나는 argparse를 사용하여이 기능이는 argparse

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

def square(a): 
    print a**2 

지금은 정의하고 리눅스 명령 (옵션)와 같은 기능을 가지고 있습니다.

이 코드

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

을 생산

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) 

: 그래서 내가 기능이 자신의 매개 변수를 처리하는 방법을 변경해야한다고

args.func(args) 

참고로 사용할 수 있습니다 . '추가'만 사용하십시오. 그들은 옵션 깃발처럼 보이기로되어 있지 않습니다. 또한 서브 파서와 함께'setdefaults'를 사용할 때 문서를 검토하십시오. – hpaulj

답변

1

--add로 명령을 전달하는 동안이 오류가 점점 오전과 노력이 optionals 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 
나는 add_subparsers 명령에 dest='cmd'을 추가

print(args) 생산 (210)는 더 많은 정보를 제공합니다. 하위 파서 이름은 이제 args.cmd으로 사용할 수 있습니다. 따라서 func을 추가 할 필요가 없습니다.

는 그러나 argparse 문서가이 args.func으로 set_defaults

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

add_parser.set_defaults(func=add) 

의 대체 사용을 제안 할 실제로 함수 객체뿐만 아니라 문자열 이름입니다. subparser 이름에서 - ''를 제거

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