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

Geo*_*res 2 python arguments argument-passing command-line-arguments

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

python prog1 --foo 1 --bar 2
Run Code Online (Sandbox Code Playgroud)

这里foobar是分别是值1和值的可选参数2

python prog1 --foo 1 --bar 2 -- --foo 4 --bar 14
Run Code Online (Sandbox Code Playgroud)

在这里我希望foo并且bar之前'-- '被解析为可选参数.但是我希望'--foo 4 --bar 14'将其解析为可选参数的值'-- '.我想这样做没有重命名而来后的参数'-- ',以foo2bar2,如果可能的话.

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

che*_*ner 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()
Run Code Online (Sandbox Code Playgroud)

然后命令

% python prog1 --foo 1 --bar 2 -- --foo 4 --bar 14
Run Code Online (Sandbox Code Playgroud)

产生

Namespace(bar='2', foo='1', remaining=['--', '--foo', '4', '--bar', '14'])
Run Code Online (Sandbox Code Playgroud)

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

args = p.parse_args()
args.remaining = " ".join(args.remaining)
print args
Run Code Online (Sandbox Code Playgroud)

然后结果是

Namespace(bar='2', foo='1', remaining='-- --foo 4 --bar 14')
Run Code Online (Sandbox Code Playgroud)

  • 我运行了这段代码,剩下的就是`剩余= [' - ',' - foo','4',' - bar','14'].注意` - `出现在剩下的. (6认同)