argparse:确定使用了哪个subparser

时间:2011-11-23 22:33:52

标签: python argparse

我认为这一定很容易,但我不明白。

假设我有以下arparse解析器:

import argparse

parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')

# all
all_parser = subparsers.add_parser('all', help='process all apps')

# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')

如何确定使用了哪个subparser? 主叫:

print parser.parse_args(["all"])

给了我一个空命名空间:

Namespace()

2 个答案:

答案 0 :(得分:244)

更简单的解决方案是将dest添加到add_subparsers来电。这在documentation

中被埋没了一点
  

[...]如果有必要检查调用的子分析器的名称,add_subparsers()调用的dest关键字参数将起作用

在您的示例中,替换:

subparsers = parser.add_subparsers(help='commands')

使用:

subparsers = parser.add_subparsers(help='commands', dest='command')

现在如果你跑:

print parser.parse_args(["all"])

你会得到

Namespace(command='all')

答案 1 :(得分:66)

修改:请参阅quornian's answer此问题,这比我的要好,应该是接受的答案。

根据argparse documentation parser.parse_args(...)的结果将“仅包含主解析器和所选子解析器的属性”。不幸的是,这可能不足以确定使用哪个子解析器。文档建议在子解析器上使用set_defaults(...)方法来解决此问题。

例如,我已将set_defaults()的调用添加到您的代码中:

import argparse

parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')

# all
all_parser = subparsers.add_parser('all', help='process all apps')
all_parser.set_defaults(which='all')

# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')
app_parser.set_defaults(which='app')

现在如果你运行

print parser.parse_args(["all"])

结果是

Namespace(which='all')

查看add_subparsers()文档以获取更多信息和其他示例。