我正在使用 Argparser 来处理我的 CLI prog 的参数。但随着时间的推移,我认为使用它不是一个好主意。问题来了。我想使用没有任何前缀字符的选项。像git commit或svn move。我搜索了一下,发现 Argparse 有一个 add_subparser() 方法。让我们填充我们的foo prog:
parser = argparse.ArgumentParser(prog='foo', usage='%(prog)s [options]')
subparsers = parser.add_subparsers(help='sub-command help')
parser_a = subparsers.add_parser('add', help='a help')
parser_a.add_argument('-ap', '--add-project',
nargs='*',
action='store',
help="Add project")
parser_d = subparsers.add_parser('del', help='a help')
parser_d.add_argument('-dp', '--delete-project',
nargs='*',
action='store',
help="Delete project")
args = parser.parser_args()
现在让使用选项执行 foo 并打印args
命名空间(我没有过去整个代码,你明白了):
$ ./foo del
Namespace(delete_project=None)
$ ./foo add
Namespace(add_project=None)
如您所见,如果我执行 option del
,add_project不会传递给 variable args
。如果我的 main() 函数中有一个“if 子句”,这会导致问题,例如
def main(args):
if args.delete_project:
...
if args.add_project:
...
我会得到一个AttributeError异常,如果我执行,命名空间没有名为add_project./foo del
的属性。除此之外,我无法将任何参数传递给 optionsdel
和add
. 我还将 prefix_chars 设置为一个空字符串,这也不起作用。
有什么办法处理它?argparse 是否能够创建 git、svn 等选项。或者我应该创建自己的函数并自己处理所有参数?