python argparse - 向没有参数的subparser添加动作?

时间:2014-08-31 17:28:49

标签: python python-2.7 argparse

我将subparsers添加到我的解析器中以模拟子命令功能(例如代码参见:Simple command line application in python - parse user input?)。现在我想添加一个quit subparser /命令,它不带任何参数,并且有一个" quit"附加行动。可能吗 ?我怎么能去做呢?

1 个答案:

答案 0 :(得分:16)

subcommands的文档提供了两个如何识别子分析器的示例。

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

一个是给add_subparsers一个dest

def do_quit(args):
    # action
    quit()

parser = ArgumentParser()
subparser = parser.add_subparsers(dest='cmd')
....
subparser.add_parser('quit')
...
args = parser.parse_args()
print args.cmd   # displays 'quit'
if args.cmd == 'quit':
   do_quit(args)

另一种方法是使用set_defaults将subparser与函数链接:

parser = ArgumentParser()
subparsers = parser.add_subparsers()
...
parser_quit = subparsers.add_parser('quit')
parser_quit.set_defaults(func=do_quit)
...
args = parser.parse_args()
args.func(args)

进一步思考,这是一种方法,使用自定义Action。它就像_HelpAction(由-h使用)。它由nargs=0(或'?')的位置参数调用。总是调用这样的参数,即使没有匹配它的字符串(或者更确切地说,0个字符串匹配它)。这是一个逻辑的,但有点模糊,是如何处理位置的结果。

class QuitAction(argparse.Action):
    def __call__(self, parser, *args, **kwargs):
        parser.exit(message="QUITTING\n")

p=argparse.ArgumentParser()
sp=p.add_subparsers(dest='cmd')
p1=sp.add_parser('quit')
p1.add_argument('foo', action=QuitAction, nargs='?', help=argparse.SUPPRESS)
p.parse_args(['quit'])

生成(在Ipython中运行时):

QUITTING
An exception has occurred, use %tb to see the full traceback.    
SystemExit: 0