我想要一个带两个参数的选项。即希望能够使用
$ ./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"
答案 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 meansprog --foo=bar baz qux
orprog --foo=bar,baz qux
orprog --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))