Docopt在中间接受多个args?

时间:2014-06-27 17:00:05

标签: python docopt

我希望我的脚本接受命令行参数,例如" cp"命令:

'''
Usage:
cp.py <source>... <directory>
cp.py -t <directory> <source>...
cp.py -s <source>... -t <directory>
'''

那些命令行

$ python cp.py src/path/1 src/path/2 target/path
$ python cp.py -t target/path src/path/1 src/path/2
$ python cp.py -s src/path/1 src/path/2 -t target/path

会得到相同的结果:

{'<source>':['src/path/1', 'src/path/2'],'<directory>': 'target/path'}
非常感谢。抱歉我的英语:)

1 个答案:

答案 0 :(得分:2)

目前不支持

你并不是唯一一个梦想有这种功能的人,请参阅docopt问题#190 Repeating positional arguments followed by a single positional argument

重复参数后跟选项

的歧义

重复位置参数后的选项会使解析变得模糊。想象一个文件,与命令选项具有相同的名称 - 如何指定它以及您期望得到什么结果?

提议的替代方案(更改命令行设计)

我将假设您希望将目标目录放在最后,以使其对用户更直观。

带值

的重复选项
Usage:
    cp.py  (-s <source>)... -t <directory>

这允许一个目标目录和多个源。

将重复的参数作为最后一个

Usage:
    cp.py <directory> <source>...

这打破了目标作为最后一个的偏好,但很容易。

结论

  • 当前docopt目前不支持cp正在使用的样式。一个原因是它不容易,另一个原因cp有时过于复杂甚至含糊不清。
  • 使用重复参数后跟选项总是很棘手,尽量避免这种情况。
  • 选项是可选的,因此使用选项与此规则相矛盾,以便于使用命令行程序。
  • 目前,我的偏好是使用目标参数作为第一个位置参数,然后是重复的源位置参数。
  • 如果docopt允许多个位置参数后跟固定的位置参数集,那将是很好的,但目前尚未实现。