使用 docopt 的多个位置和可选参数

Multiple positional and optional arguments using docopt

我正在尝试使用 docopt 包实现 python3 CLI。我试图让我的程序接受多个位置输入文件和一个可选的输出文件列表。 我的文档字符串的 MWE 是:

__doc__ = """
    Usage:
        test.py [INPUT...] [-o OUTPUT...] [-t TEST]

    Options:
        -o OUTPUT..., --output OUTPUT...  #One output file for each INPUT file [default: DEFAULT]
        -t TEST, --test TEST              #A test option
"""

例如程序调用为

test.py FILE_A FILE_B -o OUTFILE_A OUTFILE B -t true

应该return一个字典:

{'--output': ['OUTFILE_A', 'OUTFILE_B'],
 '--test': 'true',
 'INPUT': ['FILE_A', 'FILE_B']}

但出于某种原因,它总是附加到 INPUT 参数:

{'--output': ['OUTFILE_A'],
 '--test': 'true',
 'INPUT': ['FILE_A', 'FILE_B', 'OUTFILE_B']}

不幸的是,Docopt 中的选项只能接受一个参数,因此 [-o OUTPUT...] 将不起作用。如您所述,其余元素将被解释为附加参数。

一种解决方法是将省略号移到方括号外:

Usage:
    test.py [INPUT...] [-o OUTPUT]... [-t TEST]

并像这样使用它:

test.py FILE_A FILE_B -o OUTFILE_A -o OUTFILE_B

它看起来不太好,但它确实有效。