使用docopt的两个参数的选项

时间:2018-05-14 17:28:28

标签: python docopt

我想要一个带两个参数的选项。即希望能够使用

$ ./foo --path "old" "new"

或者我真正想要的是:

$ ./foo --path "old" "new" --path "old" "new"

但我不知道该怎么办? (事实上​​我担心这可能不可能......)

我不想要什么,但哪个很接近

我知道如何重复选项(见下文),但这不是我想要的。

#!/usr/bin/env python3
'''foo

Usage:
  foo [--path ARG]...

Options:
  --path=ARG  Repeating option.
'''

import docopt

args = docopt.docopt(__doc__)

print(args)

可以用

调用
$ ./foo --path "old" --path "new"

3 个答案:

答案 0 :(得分:1)

This is not possible to accomplish with docopt.

The owner of the project gives the following reason:

Because in invocation like prog --foo bar baz qux there's no way for a person to tell if it means prog --foo=bar baz qux or prog --foo=bar,baz qux or prog --foo=bar,baz,qux.

which I think is pretty reasonable.

I would suggest using two options instead, maybe --from and --to, or --old-path and --new-path.

Alternatively, you could use argparse instead, and set the nargs option (e.g. nargs=2).

答案 1 :(得分:1)

可以使用docopt轻松存档。

语法:Usage: ./foo [--path <src> <dst>]...

输入:./foo --path src1 dst1 --path src2 dst2

代码:

>>> from docopt import docopt
>>> doc = "Usage: ./foo [--path <src> <dst>]..."
>>> argv = "--path old1 new1 --path old2 new2".split()
>>> args = docopt(doc, argv)

结果:

{
  "--path": 2, 
  "<dst>": [
    "dst1", 
    "dst2"
  ], 
  "<src>": [
    "src1", 
    "src2"
  ]
}

现在用它做点什么:

>>> if bool(args["--path"]):
>>>     n = 1 if args["--path"] is True else if args["--path"]
>>>     for i in range(0, n)]:
>>>         print("{}, {}".format(args["<old>"][i], args["<new>"][i]))
src1, dst1
src2, dst2

要添加多个位置参数,需要使用parens“()”来使路径选项和参数的顺序正确。

Usage: ./foo [(--path <src> <dst>)]... <arg>...

注意:如果您使用具有多个参数的选项,则docopt不会引发SystemExit以防用户混淆语法并输入./foo arg --path src dst。你必须自己处理它或在它前面添加另一个(子)命令。

Usage: ./foo [(--path <src> <dst>)]... bar <arg>...

答案 2 :(得分:0)

you can use click lib http://click.pocoo.org/5/options/

@click.command()
@click.option('--path', '-m', multiple=True)
def run(path):
    print('\n'.join(path))