python argparse - 如何为无参数的子解析器添加动作?

18 投票
1 回答
10781 浏览
提问于 2025-04-19 02:33

我正在给我的解析器添加子解析器,以模拟子命令的功能(例如代码可以参考:在Python中创建简单的命令行应用程序 - 解析用户输入?)。现在我想添加一个 quit 子解析器/命令,它不需要任何参数,并且有一个“退出”的动作。这样做可以吗?我该怎么做呢?

1 个回答

25

关于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将子解析器和一个函数关联起来:

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

撰写回答