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

时间:2016-05-21 19:49:21

标签: python argparse

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

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

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

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

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

2 个答案:

答案 0 :(得分:23)

这是一种hackish方式,但效果很好:

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

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()

例如:

python arbitrary_parser.py ha -bar 12 -lol huhu -rofl haha

然后结果将是

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

答案 1 :(得分:2)

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

您是否考虑过sys.argv行应该是什么样的?如何向用户解释这一点?

您如何直接从 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)} 解析此工作?看起来你可以收集3件:

key:value

还有其他SO问题询问通用 --args key1:value1 key2:value2 对。比如:

nargs='*'

这可以通过:处理,并在=(或key)上分割每个输入字符串并按argparse存储内容。

您的要求最不适合argv使用,因为它要求绕过将参数标记与argparse中的字符串匹配的整个想法。它需要,一些方法,关闭所有正常的#stred { width: 90%; margin: 0 auto; } #img { width: 80%; } #center { text-align: center; } #container1 { float: left; width: 100%; padding: 10px; box-sizing: border-box; overflow: auto; } #col1 { float: left; width: 25%; background: red; padding: 20px; box-sizing: border-box; } #col2 { float: left; width: 25%; background: yellow; padding: 20px; box-sizing: border-box; } #col3 { float: left; width: 25%; background: green; padding: 20px; box-sizing: border-box; } #col4 { float: left; width: 25%; background: blue; padding: 20px; box-sizing: border-box; } @media screen and (max-width: 500px) { #stred { width: 100%; } #container1 { float: left; width: 100%; overflow: auto; height: auto; } #col1 { float: left; width: 50%; background: red; } #col2 { float: left; width: 50%; background: yellow; } #col3 { float: left; width: 50%; background: green; } #col4 { float: left; width: 50%; background: blue; } }解析。

看起来几年前我提出了同样的建议

Parse non-pre-defined argument

或更早

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