argparse:列表中的标志
argparse: Flags from a list
我在 python 中有一个方法来解析我的 CI 库所需的所有 api 请求。
实际上,此方法的整个配置都存储在一个 yaml 文件中。
示例:
ci:
sonar:
name: "python_module.ci.sonar_api"
env:
name: "Sonar"
required:
AUTH_TOKEN: ["--token", "--t"]
HOST_URL: ["--url", "--host", "--U"]
optioal:
TAGS: ["--tags", "--T"]
...
...
我也将此方法与 pythons 脚本一起使用以生成报告或由 jenkins 调用,示例将与这些脚本之一相关
我有这段代码来构建 argparse(args_dict
参数是必需值和可选值的附加,project_name
是任何字符串):
def parse(project_name, args_dict):
parse_args = argparse.ArgumentParser(
description='Request to the '+project_name+' api service.'
)
for _key in args_dict:
parse_args.add_argument(
str(', '.join(args_dict[_key])), action="store", dest=_key,
help=project_name+" "+_key+" ENV::"+project_name.upper()+"_"+_key,
default=os.environ.get(project_name.upper()+"_"+_key, None)
)
return parse_args
执行这些脚本的结果是:
./sonar_report -h
sonar_report | 2020-10-31 20:34:18.194862 | START | Starting process
usage: sonar_report [-h] [--token, --t AUTH_TOKEN] [--url, --host, --U HOST_URL] [--tags, --T
TAGS]
Request to the Sonar api service.
optional arguments:
-h, --help show this help message and exit
--token, --t AUTH_TOKEN
Sonar AUTH_TOKEN ENV::SONAR_AUTH_TOKEN
--url, --host, --U HOST_URL
Sonar HOST_URL ENV::SONAR_HOST_URL
--tags, --T TAGS Sonar TAGS ENV::SONAR_TAGS
如果我使用第一个定义的标志执行此脚本,它会起作用,但问题是当我对任何参数使用另一个标志时:
usage: sonar_report [-h] [--token, --t AUTH_TOKEN] [--url, --host, --U HOST_URL] [--tags, --T
TAGS]
sonar_report: error: unrecognized arguments: --T test
有人知道如何将标志作为列表传递吗?
编辑:
我排除了忽略未知参数的错误并打印了参数的值:
def validate(argument_parser, args_dict, ignore_unknowns=None):
try:
if ignore_unknowns is None:
params = vars(argument_parser.parse_args())
else:
_params, _unknowns = argument_parser.parse_known_args()
params = vars(_params)
except Exception:
print(f"###ERROR## Trying to parse dictionary's arguments: " +
f"{str(Exception)}")
argument_parser.print_help()
print()
return None
print(_params)
print(_unknowns)
.........
结果是:
Namespace(AUTH_TOKEN='***************************',
HOST_URL='***************************', TAGS=None)
['--T', 'test']
主要是这样的:
params: project_name, env, required_args=None, ignore_unknowns=True
return: (validate(parse(project_name, env), required_args, ignore_unknowns))
定义一个简单的字典:
In [197]: dd = {'foo':['-f', '--foo']}
In [198]: key='foo'
In [206]: import argparse
In [207]: parser=argparse.ArgumentParser()
使用您的 str/join
来定义参数。我让 argparse
设置 dest
以使操作更清晰:
In [208]: parser.add_argument(str(', '.join(dd[key])), help=f'help for {key}')
Out[208]: _StoreAction(option_strings=['-f, --foo'], dest='f, __foo', nargs=None, const=None, default=None, type=None, choices=None, help='help for foo', metavar=None)
In [209]: parser.print_help()
usage: ipython3 [-h] [-f, --foo F, __FOO]
optional arguments:
-h, --help show this help message and exit
-f, --foo F, __FOO help for foo
In [210]: parser.parse_args([])
Out[210]: Namespace(**{'f, __foo': None})
请注意,它期望的标志是 '-f, --foo' 的组合,而不是单独的两个字符串。
如果我改用 **dd[key]
,字符串列表将被解压:
In [211]: parser=argparse.ArgumentParser()
In [212]: parser.add_argument(*dd[key], help=f'help for {key}')
Out[212]: _StoreAction(option_strings=['-f', '--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help='help for foo', metavar=None)
In [213]: parser.print_help()
usage: ipython3 [-h] [-f FOO]
optional arguments:
-h, --help show this help message and exit
-f FOO, --foo FOO help for foo
In [214]: parser.parse_args([])
Out[214]: Namespace(foo=None)
In [215]: parser.parse_args(['--foo','foobar'])
Out[215]: Namespace(foo='foobar')
现在目标是 foo
,'-f' 和 '--foo' 都有效。
add_argument
returns 一个 Action 对象。通常这个 return 会被忽略,但在这个交互式会话中它会显示出来,让我们更清楚地了解正在发生的事情。
我在 python 中有一个方法来解析我的 CI 库所需的所有 api 请求。
实际上,此方法的整个配置都存储在一个 yaml 文件中。
示例:
ci:
sonar:
name: "python_module.ci.sonar_api"
env:
name: "Sonar"
required:
AUTH_TOKEN: ["--token", "--t"]
HOST_URL: ["--url", "--host", "--U"]
optioal:
TAGS: ["--tags", "--T"]
...
...
我也将此方法与 pythons 脚本一起使用以生成报告或由 jenkins 调用,示例将与这些脚本之一相关
我有这段代码来构建 argparse(args_dict
参数是必需值和可选值的附加,project_name
是任何字符串):
def parse(project_name, args_dict):
parse_args = argparse.ArgumentParser(
description='Request to the '+project_name+' api service.'
)
for _key in args_dict:
parse_args.add_argument(
str(', '.join(args_dict[_key])), action="store", dest=_key,
help=project_name+" "+_key+" ENV::"+project_name.upper()+"_"+_key,
default=os.environ.get(project_name.upper()+"_"+_key, None)
)
return parse_args
执行这些脚本的结果是:
./sonar_report -h
sonar_report | 2020-10-31 20:34:18.194862 | START | Starting process
usage: sonar_report [-h] [--token, --t AUTH_TOKEN] [--url, --host, --U HOST_URL] [--tags, --T
TAGS]
Request to the Sonar api service.
optional arguments:
-h, --help show this help message and exit
--token, --t AUTH_TOKEN
Sonar AUTH_TOKEN ENV::SONAR_AUTH_TOKEN
--url, --host, --U HOST_URL
Sonar HOST_URL ENV::SONAR_HOST_URL
--tags, --T TAGS Sonar TAGS ENV::SONAR_TAGS
如果我使用第一个定义的标志执行此脚本,它会起作用,但问题是当我对任何参数使用另一个标志时:
usage: sonar_report [-h] [--token, --t AUTH_TOKEN] [--url, --host, --U HOST_URL] [--tags, --T
TAGS]
sonar_report: error: unrecognized arguments: --T test
有人知道如何将标志作为列表传递吗?
编辑:
我排除了忽略未知参数的错误并打印了参数的值:
def validate(argument_parser, args_dict, ignore_unknowns=None):
try:
if ignore_unknowns is None:
params = vars(argument_parser.parse_args())
else:
_params, _unknowns = argument_parser.parse_known_args()
params = vars(_params)
except Exception:
print(f"###ERROR## Trying to parse dictionary's arguments: " +
f"{str(Exception)}")
argument_parser.print_help()
print()
return None
print(_params)
print(_unknowns)
.........
结果是:
Namespace(AUTH_TOKEN='***************************',
HOST_URL='***************************', TAGS=None)
['--T', 'test']
主要是这样的:
params: project_name, env, required_args=None, ignore_unknowns=True
return: (validate(parse(project_name, env), required_args, ignore_unknowns))
定义一个简单的字典:
In [197]: dd = {'foo':['-f', '--foo']}
In [198]: key='foo'
In [206]: import argparse
In [207]: parser=argparse.ArgumentParser()
使用您的 str/join
来定义参数。我让 argparse
设置 dest
以使操作更清晰:
In [208]: parser.add_argument(str(', '.join(dd[key])), help=f'help for {key}')
Out[208]: _StoreAction(option_strings=['-f, --foo'], dest='f, __foo', nargs=None, const=None, default=None, type=None, choices=None, help='help for foo', metavar=None)
In [209]: parser.print_help()
usage: ipython3 [-h] [-f, --foo F, __FOO]
optional arguments:
-h, --help show this help message and exit
-f, --foo F, __FOO help for foo
In [210]: parser.parse_args([])
Out[210]: Namespace(**{'f, __foo': None})
请注意,它期望的标志是 '-f, --foo' 的组合,而不是单独的两个字符串。
如果我改用 **dd[key]
,字符串列表将被解压:
In [211]: parser=argparse.ArgumentParser()
In [212]: parser.add_argument(*dd[key], help=f'help for {key}')
Out[212]: _StoreAction(option_strings=['-f', '--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help='help for foo', metavar=None)
In [213]: parser.print_help()
usage: ipython3 [-h] [-f FOO]
optional arguments:
-h, --help show this help message and exit
-f FOO, --foo FOO help for foo
In [214]: parser.parse_args([])
Out[214]: Namespace(foo=None)
In [215]: parser.parse_args(['--foo','foobar'])
Out[215]: Namespace(foo='foobar')
现在目标是 foo
,'-f' 和 '--foo' 都有效。
add_argument
returns 一个 Action 对象。通常这个 return 会被忽略,但在这个交互式会话中它会显示出来,让我们更清楚地了解正在发生的事情。