使用具有NARGS和args,而不是命令行输入parser.parse_args()

问题描述 投票:-1回答:2

我有一个接受可变数量的字符串参数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]让我的错误。

python command-line-interface argparse
2个回答
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["ab", "cd"]

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

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

从命令行产生同样的事情,你必须使用

python --example "ab cd"

引号覆盖在白色的空间正常分裂。你必须使用shlex.split模仿这种行为。


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(',')
推荐问答
热门问答
最新问答