Argparse在“ choice”自变量中间吃任意字符串

时间:2018-07-27 13:21:56

标签: python command-line-arguments argparse

我有一个必须接受这样的命令行的程序:

python wood.py clean and paint chair red

命令行按以下顺序读取:

  • 来自有限集的至少一个操作:cleansandpaintand一词是语法糖,以后会忽略
  • 任意家具名称
  • 从有限的一组颜色中进行选择:bluewhitered
  • 有限集合中的单个可选处理选项:vintagerusheco

我已经用以下Python代码实现了

import argparse

from pprint import pprint as pp

parser = argparse.ArgumentParser()

parser.add_argument('operations', metavar='operations', type=str, choices=['clean','sand','paint', 'and'], nargs="+")
parser.add_argument('furniture', metavar='furniture', type=str)
parser.add_argument('color', metavar='color', choices=['blue','white','red'], type=str)
parser.add_argument('handling', metavar='handling', type=str, choices=['rush','vintage','ecologic'], nargs="?")

args = parser.parse_args()

pp([op for op in args.operations if op != 'and'])
pp(args.furniture)
pp(args.color)
pp(args.handling)

它可以工作,但是当我在最后添加可选的handling参数时,argparse会将家具(椅子)解释为一种操作。

> python wood.py clean and sand and paint chair red vintage
usage: wood.py [-h]
                  operations [operations ...] furniture [furniture ...] color
                  [handling]
wood.py: error: argument operations: invalid choice: 'chair' (choose from 'clean', 'sand', 'paint', 'and')

是什么使argparse认为选择参数之后的任意字符串是该选择的一部分?

1 个答案:

答案 0 :(得分:0)

argparse令人困惑,因为处理从h开始,而h用于help。使用其他单词或使用大写的H

    parser.add_argument('Handling', metavar='handling', help='bam')

由于args.Handling仅会更改帮助文本中的名称,因此以后您将不得不使用metavar