使用 * 在 argparse 中指定许多选项

问题描述 投票:0回答:2

我有个问题想问你!我使用 argparse 开发了一个带有许多选项的命令行工具。这是我所拥有的简化版本:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--skip-part1', action='store_true', default=False)
parser.add_argument('--skip-part2', action='store_true', default=False)
parser.add_argument('--skip-part3', action='store_true', default=False)
parser.add_argument('--skip-part4', action='store_true', default=False)

我希望用户能够通过输入类似的内容来选择所有可选的skip

参数
myscript.py --skip-*

更高级,使用正则表达式:

myscript.py --skip-part[1-3]

仅选择前三个选项。

你知道我如何才能获得这样的行为吗?

谢谢

python argparse
2个回答
1
投票

你可以尝试这样的事情:

parser.add_argument('--skip', action='store', default=None, nargs=1) # nargs = 1 means that 1 argument is accepted

当您调用类似

myscript.py --skip 1-3
args.skip == ["1-3"]
的内容时,就会为真。 所以你会得到一个只有一个字符串的列表。 有了这个字符串你就可以做任何你想做的事情。您可以将其拆分为“-”以获得示例的开始和结束。


0
投票

argparse
需要静态定义的选项名称。

但是您可以自行预处理

sys.argv
以执行任何类型的扩展,然后调用
parse_args()

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--skip-part1', action='store_true', default=False)
parser.add_argument('--skip-part2', action='store_true', default=False)
parser.add_argument('--skip-part3', action='store_true', default=False)
parser.add_argument('--skip-part4', action='store_true', default=False)

# expand sys.argv:
import sys
import fnmatch
all_options = [opt
               for a in parser._actions
               for opt in a.option_strings
              ]
new_argv = []
for arg in sys.argv:
    matched = False
    for opt in all_options:
        if fnmatch.fnmatch(opt, arg):
            matched = True
            new_argv.append(opt)
    if not matched:
        new_argv.append(arg)
sys.argv = new_argv

print(parser.parse_args())

现在路过

--skip-part[1-3]
将会返回你
Namespace(skip_part1=True, skip_part2=True, skip_part3=True, skip_part4=False)
并传递
--skip-*
将启用所有匹配的开关。

© www.soinside.com 2019 - 2024. All rights reserved.