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')