Docopt是否接受中间的多个参数?

3 投票
2 回答
604 浏览
提问于 2025-04-18 11:21

我想让我的脚本能够像“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'}

非常感谢你们!对我的英语不好表示抱歉:)

2 个回答

0

多年后,我再次遇到类似的问题,发现之前被接受的回答提到的问题依然存在。

不过,我发现现在有一个替代的库叫做 docpie,它同样是用来解析 文档字符串,用于命令行界面,而且支持 cp 语法。由于它和 docopt 非常相似(因此也相对兼容),这里有一个 明确的区别列表

2

目前不支持

你并不是唯一一个希望有这种功能的人,可以看看 docopt 的问题 #190 重复的位置参数后面跟一个单独的位置参数

重复参数后跟选项的模糊性

在重复的位置参数后面加选项会让解析变得模糊。想象一下,如果有一个文件的名字和命令选项相同,你该怎么指定它?你期待的结果是什么呢?

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

我假设你希望把目标目录放在最后,这样对用户来说更直观。

带值的重复选项

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

这样可以指定一个目标目录和多个源。

把重复参数放在最后

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

这样虽然打破了目标参数放在最后的偏好,但操作起来相对简单。

结论

  • 目前的 docopt 不支持 cp 使用的这种风格。原因之一是这并不简单,另一个原因是 cp 有时太复杂,甚至会造成歧义。
  • 使用重复参数后跟选项总是比较棘手,尽量避免这种情况。
  • 选项应该是可选的,所以使用必需的选项与易用的命令行程序的原则相悖。
  • 目前,我更倾向于把目标参数放在第一个位置,然后再跟上重复的源位置参数。
  • 如果 docopt 能允许多个位置参数后面跟一组固定的位置参数,那就太好了,但目前还没有实现。

撰写回答