argparse:确定使用哪个子分析器
我认为这一定很容易,但我不明白。
假设我有以下的arparseparsing器:
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')
我怎样才能确定使用哪个分析器? 电话:
print parser.parse_args(["all"])
给我一个空的名字空间:
Namespace()
编辑:请参阅quornian对这个问题的回答 ,这比我的更好,应该是被接受的答案。
根据argparse文档 , parser.parse_args(...)
的结果将“只包含主分析器和被select的子分析器的属性”。 不幸的是,这可能不足以确定使用哪个子分析器。 文档build议在子parsing器上使用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()
文档以获取更多信息和另一个示例。
更简单的解决scheme是将add添加到add_subparsers
调用中。 这在文档中被深入一些:
[…]如果有必要检查被调用的子分析器的名称,add_subparsers()调用的dest关键字参数将工作
在你的例子中replace:
subparsers = parser.add_subparsers(help='commands')
有:
subparsers = parser.add_subparsers(help='commands', dest='command')
现在如果你运行:
print parser.parse_args(["all"])
你会得到
Namespace(command='all')