使用argparse调用不同的函数

2024-10-02 22:24:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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>:按现在的样子调用函数1

python myscript.py function2 -c <var>:只调用函数2

python myscript.py function3 -g <var>:只调用函数3

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


Tags: py脚本addparservardefargparseargs
3条回答
parser.add_argument('-a',' a', dest='action', action='store_const', const=function1)

要调用相关函数,您需要添加const=function1

您可以看到这个problem作为正确答案

默认子命令

如果您希望有子命令,并且在没有指定子命令的情况下将其中一个设为默认值,则不能使用典型的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选项有用,则需要做更多的工作:

  • 我们需要手动处理帮助,因为有时我们需要整体帮助,有时需要子命令的帮助
  • 我们不能直接给出默认子命令,因为我们需要知道是否指定了它

这应该可以做到:

^{pr2}$

你可以这样做。使用set_defaults(func=您的_函数)

   _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\u function()

相关问题 更多 >