argparse键=值参数



第一个链接在第一节中有相同的问题,但没有得到回答(python argparse:parameter=value(。第二个问题是类似的,但我似乎无法将其用于我的特定案例(使用argparse解析形式为"arg=val"的参数(。

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

N。B.参数名称很难处理,所以我使用add_argument中的dest选项进行重命名。

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格式。即

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

工作。argparse模块接受--veryLongArgName1=foo--veryLongArgName1 foo格式。

您试图传递给argparse的确切命令行参数是什么,导致它无法工作?

有点晚了,但对于任何与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)

这将截取参数(ARG1, ARG2, ...(并添加一个自定义前缀,该前缀稍后将被替换(以及不需要的空间(为=符号。return语句中的and确保只在结果为非空时修改结果。

相关内容

  • 没有找到相关文章

最新更新