3

我已经尝试在堆栈溢出时查找此问题的答案,但找不到针对我的特定情况的确切答案。

第一个链接在第一部分有相同的问题,但没有答案(python argparse: parameter=value)。这第二个问题是相似的,但我似乎无法让它适用于我的特定情况(使用 argparse 解析形式为 "arg= val" 的参数)。

所以我的情况是这样的——我正在重写一个被许多其他脚本使用的 python 包装器(我不想修改这些其他脚本)。--key=value目前,python 包装器是使用形式为许多不同参数的命令行参数调用的,但是是手动解析的。我想用 argparse 解析它们。

注意参数名称很笨拙,所以我使用destadd_argument 中的选项重命名。

parser = argparse.ArgumentParser(description='Wrappin Ronnie Reagan')
parser.add_argument("--veryLongArgName1", nargs=1, dest="arg1", required=True)
parser.add_argument("--veryLongArgName2", nargs=1,   dest="arg2")
parser.add_argument("--veryLongArgName3", nargs=1,  dest="arg3")
userOpts = vars(parser.parse_args())

其中,虽然显然正确解析了传递的命令行,但将其显示为帮助:

usage: testing_argsparse.py [-h] --veryLongArgName1 ARG1
                        [--veryLongArgName2 ARG2]
                        [--veryLongArgName3 ARG3]
testing_argsparse.py: error: argument --veryLongArgName1 is required

但我想要的是所有参数都用--key=value格式指定,而不是--key value. IE

usage: testing_argsparse.py [-h] --veryLongArgName1=ARG1
                        [--veryLongArgName2=ARG2]
                        [--veryLongArgName3=ARG3]
testing_argsparse.py: error: argument --veryLongArgName1 is required

提前致谢!

4

2 回答 2

2
testing_argsparse.py --veryLongArgName1=foo

作品。argparse 模块同时接受--veryLongArgName1=foo--veryLongArgName1 foo格式。

您试图将哪些确切的命令行参数传递给 argparse 导致它不起作用?

于 2013-04-09T05:20:04.170 回答
1

有点晚了,但对于任何与 OP 有类似请求的人,您可以使用自定义HelpFormatter

class ArgFormatter(argparse.HelpFormatter):
    def _format_args(self, *args):
        result = super(ArgFormatter, self)._format_args(*args)
        return result and '%%%' + result

    def _format_actions_usage(self, *args):
        result = super(ArgFormatter, self)._format_actions_usage(*args)
        return result and result.replace(' %%%', '=')

然后可以将其传递ArgumentParser给以提供所需的行为。

parser = argparse.ArgumentParser(
    description='Wrappin Ronnie Reagan',
    formatter_class=ArgFormatter)

这会拦截 args ( ARG1, ARG2, ...) 并添加一个自定义前缀,该前缀稍后会被替换(连同不需要的空格)用于=符号。return 语句中的and确保仅在结果非空时修改结果。

于 2018-01-15T02:56:49.420 回答