Python 在解析器/子解析器的开头使用argparse.rements

Python 在解析器/子解析器的开头使用argparse.rements,python,argparse,Python,Argparse,我想实现一个arg解析器,它允许我作为子命令之一运行unittests,将参数盲目地传递给unittest.main()。e、 g 与其他子命令一起: $ foo.py foo ... $ foo.py bar ... 按照argparse的示例,这是可行的: #!/usr/bin/python import argparse

我想实现一个arg解析器,它允许我作为子命令之一运行unittests,将参数盲目地传递给unittest.main()。e、 g

与其他子命令一起:

$ 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)
$ /tmp/foo.py    
usage: PROG [-h] [-v] {foo,bar,unittest} ...
PROG: error: unrecognized arguments: -blah
但事实并非如此。它似乎首先需要一个“正常”参数:

#!/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()))             
输出:

Namespace(args=['-blah', 'blah'], cmd='unittest', command='command', verbose=False)
$ /tmp/foo.py    
usage: PROG [-h] [-v] {foo,bar,unittest} ...
PROG: error: unrecognized arguments: -blah
我可以做
打印(p.parse_args('unittest--f-g.split())
,但要求
--
某种程度上违背了argparse.rements的目的

有没有办法让
argparse
执行我想要的操作?还是我只需要手工分析这个案子


Python 2.7.5

看起来与中讨论的问题相同,
argparse.rements不能作为第一个参数使用

我从4年前的推断仍然成立,
-blah
甚至在
剩余部分
有机会行动之前就被归类为可选标志在前面被解析,但在某种意义上,
..
只是“*”的泛化。而且不是一个广泛使用的。值得一提的是,“subparser”操作有一个
nargs='+…'
值(
argparse.PARSER
)-它与余数类似,只是它至少需要一个字符串“cmd”


尚未对可能的修复进行操作。因此,您要么需要自己处理'-blah',要么使用'--'
parse\u known\u args在您的情况下也可能起作用。

如前所述,现有的行为不好。一个解决方法是实现一个简单的
ArgumentParser
子类并将其用于子Parser:

class SubcommandParser(argparse.ArgumentParser):
    """This subparser puts all remaining arguments in args attribute of namespace"""
    def parse_known_args(self, args=None, namespace=None):
        if namespace is None:
            namespace = argparse.Namespace()
        setattr(namespace, 'args', args)
        return namespace, []

...

p.add_subparsers(dest='cmd', parser_class=SubcommandParser) 

我想你找错人了。将测试代码完全排除在库代码之外。这是一个独立的脚本,我需要确保它易于测试,以防其他人修改它。外部测试线束无法实现这一点……这个特定用例正在测试的事实是不相关的。在很多其他情况下,同样的问题也会出现。