Python argparse将特定标志后的所有参数作为列表

时间:2017-09-06 10:40:06

标签: python argparse

我正在尝试像gdb一样制作argparser

program.py --valid-arg1  value1  --valid-arg2  value2  --args binary --bin-arg1 bin_arg1_value --bin-arg2 bin_arg2_value...

问题是我需要将--args之后的所有参数视为值,并将它们作为程序中的列表。我怎么能这样做?

由于

P.S。使用所有无法识别的参数这是不好的解决方案,因为python和二进制args可能具有相同的签名。

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用sys.argv代替argparse?你可以做那样的事情:

import sys

dict = {}
tmp = []
key = ''
for arg in sys.argv:
    if arg[0] == '-':
        if tmp != []:
            dict[key] = tmp
            tmp = []
        key = arg
        if key == '--args':
            dict[key] = sys.argv[sys.argv.find(key)+1:]
            break
        continue
    tmp.append(arg)

这基本上构造了一个参数字典,其中flags作为键,Flag作为值的参数列表。您可能想要查看sys.argv是什么。如果使用

调用python脚本
python script.py -h yes -f yes no yes

sys.argv可能是['python', 'script.py', '-h', ...]但是我要留给你了解。然后,而不是for arg in sys.argv,而不是for arg in sys.argv[2:]或者你想要的东西。

所以如果我们打电话

program.py --valid-arg1  value1  --valid-arg2  value2  --args binary --bin-arg1 bin_arg1_value --bin-arg2 bin_arg2_value

dict将如下所示:

dict = {
    '--valid-arg1': ['value1'],
    '--valid-arg2': ['value2'],
    'args': ['binary', '--bin-arg1', 'bin_arg1_value', '--bin-arg2', 'bin_arg2_value']
}

现在,如果您想使用--valid-arg1的值,您可以执行类似

的操作
try:
    if dict['--valid-arg1'] == some_value1:
        ...
    elif dict['--valid-arg1'] == some_value2:
        ...
except KeyError:
    # no flag --valid-arg1
    pass

使用args,您可以执行类似

的操作
try:
    if something in dict['args']:
        ...
except KeyError:
    # no additional args were given
    pass