Python argparse以不同的方式处理参数

时间:2014-09-16 15:15:43

标签: python arguments command-line-arguments argument-passing

我想创建一个可选参数,它将是'-- '(双短划线和空格)并将其后的所有内容作为其值。问题是'-- '之后可能会出现一些其他可选参数。我不希望将这些解析为可选参数,而是作为'-- '的值。例如:

python prog1 --foo 1 --bar 2

此处foobar是可选参数,分别为12

python prog1 --foo 1 --bar 2 -- --foo 4 --bar 14

在这里,我希望foo之前的bar'-- '被解析为可选参数。但我希望'--foo 4 --bar 14'被解析为可选参数'-- '的值。我想这样做,如果可能的话,不要将'-- '之后的参数重命名为foo2bar2

这可能吗?这怎么可以实现?

2 个答案:

答案 0 :(得分:8)

argparse已经支持--作为选项结束终止符。唯一的区别是默认处理单独处理以下参数。假设prog1看起来像

import argparse

p = argparse.ArgumentParser()

p.add_argument('--foo')
p.add_argument('--bar')
p.add_argument('remaining', nargs=argparse.REMAINDER)

print p.parse_args()

然后是命令

% python prog1 --foo 1 --bar 2 -- --foo 4 --bar 14

产生

Namespace(bar='2', foo='1', remaining=['--foo', '4', '--bar', '14'])

(而不是Namespace(..., remaining='--foo 4 --bar 14'))。如果需要,可以通过快速后处理步骤进行修复:

args = p.parse_args()
args.remaining = " ".join(args.remaining)
print args

然后结果是

Namespace(bar='2', foo='1', remaining='--foo 4 --bar 14')

答案 1 :(得分:0)

看起来docopt库可以为您执行此操作;

来自usage-pattern-format部分:

  

" [ - ]&#34 ;.双击" - "按惯例用于分隔位置   可能被误认为选项的参数。为了支持这一点   惯例添加" [ - ]"你的使用模式。