使用parser.parse_args()和nargs和args而不是命令行输入

时间:2019-02-06 11:27:16

标签: python command-line-interface argparse

我有一个argparse参数example,它接受​​可变数量的字符串:

parser.add_argument('--example', nargs='*', required=False, default='')

当通过命令行输入script.py --example ab cd照常使用CLI时,此方法工作正常。

我还希望它与从程序代码中传递到parser.parse_args(args) through the args argument的参数一起使用。

但是当我尝试传递parser.parse_args(["--example", "ab cd"])时,它被解释为单个字符串"ab cd",而不是abcd的列表。

类似地,以某种方式将传递parser.parse_args(["--example", "ab", "cd"])解释为单个参数,它是一个列表。因此,访问args.example[0]时会得到列表,而args.example[1]会给我一个错误。

2 个答案:

答案 0 :(得分:1)

如您的链接所示,您可以为parse_args提供一个字符串列表。

In [210]: parser = argparse.ArgumentParser()
In [211]: parser.add_argument('-i','--image_types', nargs='*', default='');

要通过不带任何命令行参数的情况下测试解析,请给它一个空列表:

In [212]: parser.parse_args([])
Out[212]: Namespace(image_types='')

带有字符串列表:

In [213]: parser.parse_args(['-i','a','b'])
Out[213]: Namespace(image_types=['a', 'b'])

或分割字符串:

In [214]: parser.parse_args('-i a b'.split())
Out[214]: Namespace(image_types=['a', 'b'])

argparse问题的答案通常使用以下形式之一来说明其行为。 split很方便。

还可以直接创建args命名空间:

In [215]: argparse.Namespace(image_types=['a','b','c'])
Out[215]: Namespace(image_types=['a', 'b', 'c'])

我不遵循您对结果的解释

parser.parse_args(["--example", "ab", "cd"])

那应该产生一个args.example的{​​{1}}。

这不是一个很好的测试用例:

["ab", "cd"]

要从命令行使用相同的东西,就必须使用

parser.parse_args(["--example", "ab cd"])

引号覆盖空白处的常规分隔符。您必须使用python --example "ab cd" 来模仿这种行为。

答案 1 :(得分:0)

argparse很难直接使用csv列表来处理列表:

parser.add_argument('--image_types', \
  help='csv list of imagetypes', \
  default='iff,gif,jpeg,png', default=None)

if args.image_types:
  args.image_types = args.image_types.split(',')
相关问题