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'}

非常感谢。很抱歉我的英语不好

目前不支持

你不是唯一一个梦想这样的特性的人,参见docopt issue #190重复位置参数后面跟着一个位置参数

重复参数后跟选项

的模糊性

重复位置参数后的选项使解析有歧义。假设有一个文件,它的名称与命令选项相同——您将如何指定它,您希望得到什么结果?

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

我假设,您更喜欢将目标目录放在最后,以便用户直观。

带有值的重复选项

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

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

将重复参数作为最后一个

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

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

<标题>结论
  • 当前docopt目前不支持该样式,cp正在使用。一个原因是不容易,另一个原因是cp有时太复杂甚至模棱两可。
  • 使用重复的参数后面跟着选项总是很棘手,尽量避免这种情况。
  • 选项是可选的,所以使用选项,这是必需的,是矛盾的这一规则,便于使用命令行程序。
  • 目前,我的偏好是使用目标参数作为第一个位置参数,然后是重复的源位置参数。
  • 如果docopt允许多个位置参数后跟固定的位置参数集,那就太好了,但目前还没有实现。

遇到类似的需求,多年后再回顾这个问题,我发现被接受的回答所提到的问题仍然没有解决。

然而,我发现现在有一个替代库docpie,它实现了cli解析文档字符串的相同原理,但支持cp语法。由于它与docopt极其相似(以及随后的相对兼容性),这里有一个明确的差异列表。

最新更新