python - 在解析器/子解析器的开头使用 argparse.REMAINDER

标签 python argparse

我想实现一个 arg 解析器,它允许我将单元测试作为子命令之一运行,盲目地将参数传递给 unittest.main()。例如,

$ foo.py unittest [args to pass to unittest.main()]

连同其他子命令:

$ foo.py foo ...
$ foo.py bar ...

按照 argparse 的例子,这是可行的:

#!/usr/bin/python                                                               
import argparse                                                                 

p = argparse.ArgumentParser(prog='PROG')                                        
p.add_argument('-v', '--verbose', action='store_true')                          
sub = p.add_subparsers(dest='cmd')                                              
foo = sub.add_parser('foo')                                                     
bar = sub.add_parser('bar')                                                     
unittest = sub.add_parser('unittest')                                           
unittest.add_argument('command') # Need to add this to make it work.                                              
unittest.add_argument('args', nargs=argparse.REMAINDER)                         

print(p.parse_args('unittest command -blah blah'.split()))       

输出:

Namespace(args=['-blah', 'blah'], cmd='unittest', command='command', verbose=False)

但这不是。它似乎首先需要一个“正常”参数:

#!/usr/bin/python                                                               
import argparse                                                                 

p = argparse.ArgumentParser(prog='PROG')                                        
p.add_argument('-v', '--verbose', action='store_true')                          
sub = p.add_subparsers(dest='cmd')                                              
foo = sub.add_parser('foo')                                                     
bar = sub.add_parser('bar')                                                     
unittest = sub.add_parser('unittest')                                           
unittest.add_argument('args', nargs=argparse.REMAINDER)                         

print(p.parse_args('unittest -blah blah'.split()))             

输出:

$ /tmp/foo.py    
usage: PROG [-h] [-v] {foo,bar,unittest} ...
PROG: error: unrecognized arguments: -blah

可以print(p.parse_args('unittest -- -f -g'.split())),但需要-- 有点违背了 argparse.REMAINDER 的目的。

有没有办法让 argparse 做我想做的事?还是我只需要手动解析这种情况?

python 2.7.5

最佳答案

看起来与 http://bugs.python.org/issue17050 中讨论的问题相同, argparse.REMAINDER 不能作为第一个参数

我 4 年前的推论仍然成立 - -blah 甚至在 REMAINDER 有机会采取行动之前就被归类为可选标志。 '--' 被较早地解析,但是 ... 在某种意义上只是 '*' 的概括。而且不是广泛使用的。 'subparsers' Action 的值(value)在于它有一个 nargs='+...' 值 (argparse.PARSER) - 它类似于 REMAINDER,只是它至少需要一个字符串, 'cmd'。

http://bugs.python.org/issue9334 中的可能修复尚未采取行动。所以你要么需要自己处理'-blah',要么使用'--'。 parse_known_args 也可能适用于您的情况。

关于python - 在解析器/子解析器的开头使用 argparse.REMAINDER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43219022/

相关文章:

python - 如何使用 argparse 删除 CLI 参数,以便 unittest 接受 arg 列表

python - 如何将字符串拆分为命令行参数,如 python 中的 shell?

python - 可选位置参数的 Argparse 值

Python 迭代切片日期字符串列表的最快方法

python - Django 限制查询

python - 如何聚合这些数据并使用 python 和 pandas 创建一个新列?

python - 子解析器 argparse "error: too few arguments"

python - 从句子中查找并删除一个单词(在单词匹配之间)python

python - 给定输入大小: (128x1x1).计算出的输出大小: (128x0x0).输出大小太小

Python 参数解析 : Too few arguments