使用argparse调用不同的函数

时间:2014-07-05 09:07:08

标签: python argparse

我是Argparse模块的新手。我几乎完成了我的剧本,但有些东西我找不到办法去做。

这是脚本:

import argparse

def function1(a, b, c):
    #mystaff
def function2(e, f):
    #mystaff
def function3(g):
    #mystaff

if __name__ == '__main__':

    parser = argparse.ArgumentParser(description='blahblah')
    parser.add_argument('-a','--a', help='blahblah', required=False, default="defaultvalue")
    parser.add_argument('-b','--b', help='blahblah', required=False)
    .......

    args = parser.parse_args()
    function1(args.a,args.b,args.c)

我想从命令提示符调用脚本。现在,我可以使用它来调用function1python myscript.py -a <var>

我想要的是:

python myscript.py -a <var>:现在调用function1

python myscript.py function2 -c <var>:仅调用function2

python myscript.py function3 -g <var>:仅调用function3

因此,如果我没有指定函数,则function1是默认值,否则我也必须从命令提示符传递函数名。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

默认子命令

如果你想拥有子命令,并且如果没有指定子命令,则使其中一个是默认的,那么你就不能使用典型的subparser方法。

你需要在两遍中完成你的argparse:

parser = ArgumentParser()
parser.add_argument("function", 
                    nargs="?",
                    choices=['function1', 'function2', 'function2'],
                    default='function1',
                    )
args, sub_args = parser.parse_known_args()

if args.function == "function1":
    parser = ArgumentParser()
    parser.add_argument('-a','--a')
    parser.add_argument('-b','--b')
    parser.add_argument('-c','--c')
    args = parser.parse_args(sub_args)
    function1(args.a, args.b, args.c)
elif args.function == "function2":
    ...
elif args.function == "function3":
    ...

处理--help

如果您希望--help选项有用,则需要做更多工作:

  • 我们需要手动处理帮助,因为有时我们需要整体帮助,有时我们需要子命令的帮助
  • 我们无法立即提供默认子命令,因为我们需要能够判断它是否已指定

这应该可以解决问题:

# Parse the subcommand argument first
parser = ArgumentParser(add_help=False)
parser.add_argument("function", 
                    nargs="?",
                    choices=['function1', 'function2', 'function2'],
                    )
parser.add_argument('--help', action='store_true')
args, sub_args = parser.parse_known_args(['--help'])

# Manually handle help
if args.help:
    # If no subcommand was specified, give general help
    if args.function is None: 
        print parser.format_help()
        sys.exit(1)
    # Otherwise pass the help option on to the subcommand
    sub_args.append('--help')

# Manually handle the default for "function"
function = "function1" if args.function is None else args.function

# Parse the remaining args as per the selected subcommand
parser = ArgumentParser(prog="%s %s" % (os.path.basename(sys.argv[0]), function))
if function == "function1":
    parser.add_argument('-a','--a')
    parser.add_argument('-b','--b')
    parser.add_argument('-c','--c')
    args = parser.parse_args(sub_args)
    function1(args.a, args.b, args.c)
elif function == "function2":
    ...
elif function == "function3":
    ...

答案 1 :(得分:0)

parser.add_argument('-a','--a', dest='action', action='store_const', const=function1)

调用您需要添加const=function1

的特定功能

您可以在problem看到正确答案

答案 2 :(得分:0)

你可以这样做。使用set_defaults(func = your_function)

   _parser = argparse.ArgumentParser(description="blalbabla awesome Framework")
   _subparsers = _parser.add_subparsers(help="sub command help")
   _check_parser = _subparsers.add_parser("check", help="check the code")
   _check_parser.add_argument("--script_path", help="can be a python file or dir", required=True)
   _check_parser.add_argument("--verbose", help='turn on debug level logging', action='store_true', default=False)
   _check_parser.set_defaults(func=do_function) 

   def  do_function(args):
     if args.script_path is file:
       xxxx

然后你可以正确访问do_function()