我已经尝试在堆栈溢出时找到答案,但找不到我特定情况的确切答案。
第一个链接在第一部分中有相同的问题,但没有答案 (python argparse: parameter=value)。而第二个问题是类似的,但我似乎无法让它适用于我的特定情况 (Using argparse to parse arguments of form "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
提前致谢!
答案 0 :(得分:2)
testing_argsparse.py --veryLongArgName1=foo
的工作原理。 argparse模块接受--veryLongArgName1=foo
和--veryLongArgName1 foo
格式。
你试图传递给argparse的哪些确切的命令行参数会导致它不起作用?
答案 1 :(得分: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, ...
)并添加一个自定义前缀,稍后会替换=
符号(以及不需要的空格)。返回语句中的and
确保仅在结果非空时修改结果。