我有个问题想问你!我使用 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]
仅选择前三个选项。
你知道我如何才能获得这样的行为吗?
谢谢
你可以尝试这样的事情:
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"]
的内容时,就会为真。
所以你会得到一个只有一个字符串的列表。
有了这个字符串你就可以做任何你想做的事情。您可以将其拆分为“-”以获得示例的开始和结束。
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-*
将启用所有匹配的开关。