是否可以使用argparse捕获任意一组可选参数?

2024-04-26 18:14:03 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以使用argparse来捕获任意一组可选参数?在

例如,应接受以下两项作为输入:

python script.py required_arg1 --var1 value1 --var2 value2 --var3 value3

python script.py required_arg1 --varA valueA --var2 value2 --varB valueB

我不知道会指定哪些可选参数接收,但会相应地处理它们。在


Tags: py参数requiredscriptargparsearg1value1value2
2条回答

可能吗?可能,但我不推荐。argparse不是解析此类输入的最佳工具,或者相反,从argparse的角度来看,这是一个糟糕的参数规范。在

你想过usage行应该是什么样子吗?如何向用户解释这一点?在

如何直接从sys.argv解析这个工作?看起来你可以收集3件:

 prog = sys.argv[0]
 arg1 = sys.argv[1]
 keys = sys.argv[2::2]
 # maybe strip   off each
 values = sys.argv[3::2]
 kvdict = {k:v for k, v in zip(keys, values)}

还有一些关于一般key:value对的SO问题。比如:

^{pr2}$

这可以通过nargs='*'和一个将:(或=)上的每个输入字符串拆分并按key存储内容的操作来处理。在

您的需求最不适合argparse使用,因为它需要绕过用argv中的字符串匹配参数标志的整个思想。它需要关闭所有正常的argparse解析。在

看来我几年前也提过同样的建议

Parse non-pre-defined argument

或者更早

Using argparse to parse arguments of form "arg= val"

这是一种老套的方法,但效果很好:

检查,哪些参数未添加并添加它们

parser=argparse.ArgumentParser()
parser.add_argument("foo")
parser.add_argument("-bar", type=int)
#parser can have any arguments, whatever you want!

parsed, unknown = parser.parse_known_args() #this is an 'internal' method
# which returns 'parsed', the same as what parse_args() would return
# and 'unknown', the remainder of that
# the difference to parse_args() is that it does not exit when it finds redundant arguments

for arg in unknown:
    if arg.startswith(("-", " ")):
        #you can pass any arguments to add_argument
        parser.add_argument(arg, type=<your type>, ...)

args=parser.parse_args()

例如:

^{pr2}$

结果就是

args = Namespace(bar=12, foo='ha', lol='huhu', rofl='haha')

相关问题 更多 >