Python 使用argparse调用不同的函数

Python 使用argparse调用不同的函数,python,argparse,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='bl

我是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)
我想从命令提示符调用脚本。现在,我可以用这个例子来调用
函数1
python myscript.py-a

我想要的是:

python myscript.py-a
:按原样调用函数1

python myscript.py function2-c
:仅调用function2

python myscript.py function3-g
:仅调用function3


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

默认子命令

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

  • 我们需要手动处理帮助,因为有时我们需要整体帮助,有时我们需要子命令的帮助
  • 我们不能马上给出默认的子命令,因为我们需要知道它是否被指定
这应该可以做到:

# 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":
    ...
要调用特定函数,需要添加
const=function1


你可以看到这是正确的答案

你可以这样做。使用设置默认值(func=您的函数)


然后您就可以正确访问do_function()

是。我在官方文件中看到了这一点。但问题是如何将第一个函数指定为默认函数,而不传递其名称,其他函数仅在命令中使用其名称。我选择了第一个选项,没有帮助,因为它更容易理解。但是,当我从命令
python myscript.py
中调用时,没有任何东西,并且预期function1正在运行,如果function==“function1”
在第一个选项中没有定义该函数,则在第
行中出现错误,如果args.function=='function1'
您缺少了
args
我试图将解决方案与
--help
一起使用,那么
args.help
在执行
args,sub_args=parser.parse_known_args(['--help'])
后将始终为真。它不应该只是args,sub_args=parser.parse_known_args()吗?如果argparse不是一个严格的要求,您可以查看click(),它允许这样的嵌套命令。这是中推荐的模式。
parser.add_argument('-a','--a', dest='action', action='store_const', const=function1)
   _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