2015-02-10 36 views
0

我在Python中使用Argparse库,并且需要检索调用时传递的所有选项。例如,如果给定的程序需要三个命令行参数:Argparse:获取在命令行中传递的所有选项

parser.add_argument('-a', action="store_true", default=False) 
parser.add_argument('-b', action="store", dest="b") 
parser.add_argument('-c', action="store", dest="c", type=int) 

所以,如果我叫python test.py -b 我需要一种方法来知道-b作为命令行选项传递。

在老optparse这可以通过重写optparse.Option做,但我无法找到它在argparse相当于

+1

它工作吗?如果不是,会发生什么? – 2015-02-10 15:25:29

+0

我不明白你想达到什么目的,为什么argparse没有做你所需要的。你能否做出更详细的解释? – 2015-02-10 15:26:48

+0

你有除了输出的例子吗? – 2015-02-10 16:08:47

回答

4

只是用于测试的默认值设置,如默认默认值None

if args.b is None: 
    # -b was not used 

这将不适用于-a,因为store_true意味着默认False。你可以告诉​​使用None作为默认而不是:

parser.add_argument('-a', action="store_true", default=None) 

但因为你不能使用-a并有not args.a是真实的,你可以测试默认还是:

parser.add_argument('-a', action="store_true") 
args = parser.parse_args() 
if not args.a: 
    # -a was not used 

如果None是一个有效的选择(比如,你使用action="store_const", const=None)默认使用不同的哨点:

_sentinel = object() 
parser.add_argument('-d', action="store_const", 
        const=None, default=_sentinel) 
args = parser.parse_args() 
if args.d is _sentinel(): 
    # -d was not used 

您还可以防止默认被设置,由默认设置为argparse.SUPPRESS

parser.add_argument('-e', default=argparse.SUPPRESS) 
args = parser.parse_args() 
if not hasattr(args, 'e'): 
    # -e was not used 

可以列出实际使用使用遍历parser._optionals._actions,看是否他们.dest属性是所有可选的动作本,而不是设置为.default值:

used_options = [ 
    action for action in parser._optionals._actions 
    if getattr(args, action.dest, action.default) is not action.default] 

演示:

>>> import argparse 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('-a', action="store_true", default=False) 
_StoreTrueAction(option_strings=['-a'], dest='a', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None) 
>>> parser.add_argument('-b', action="store", dest="b") 
_StoreAction(option_strings=['-b'], dest='b', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None) 
>>> parser.add_argument('-c', action="store", dest="c", type=int) 
_StoreAction(option_strings=['-c'], dest='c', nargs=None, const=None, default=None, type=<type 'int'>, choices=None, help=None, metavar=None) 
>>> def list_used_options(parser, args): 
...  return [ 
...   action for action in parser._optionals._actions 
...   if getattr(args, action.dest, action.default) is not action.default] 
... 
>>> args = parser.parse_args(['-a']) 
>>> list_used_options(parser, args) 
[_StoreTrueAction(option_strings=['-a'], dest='a', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)] 

这只是回应什么sys.argv[1:]已经告诉你通过了,当然。

+0

我需要存储传递给命令行的所有参数列表中。可用选项是长列表,每个选项都没有与之相关的默认值。如果你能帮助我,这将是感激的 – ujjwalwahi 2015-02-10 15:42:50

+0

@ujjwalwahi:传递给脚本的所有命令行选项已经可以作为'sys.argv'中的列表。 – 2015-02-10 16:06:11

+0

@JoelCornett:不知何故,我认为这还不够好。拥有'Action'实例可以有它的用途,但是如果OP想要确切的命令行,那么它确实已经在那里了。 – 2015-02-10 16:08:03

0

检查默认值是检查是否给出(见过)选项的最直接的方法。默认的默认None在这方面很好,因为你不能在命令行中给None。对于store_true(或false),默认值总是相反的布尔值。但是,我意识到使用这种默认并不总是方便(或可能)。

parse_args确实记录变量中看到的选项,seen_actions。它使用这个集合来测试是否看到所有'必需'选项。对此组的改进seen_non_default_actions用于测试所需的互斥组。

但这两套都不在parse_args之外。我已经开发了一个扩展了互斥组的概念的补丁。这将提供一个钩子,可以在这些seen集上运行测试(在错误报告中查找标题中包含'nest inclusive groups'的错误报告)。