如何在 pyinvoke 中使用可变数量的参数

How to use a variable number of arguments in pyinvoke

我想在 pyinvoke 的任务中使用可变数量的参数。 像这样:

from invoke import task

@task(help={'out_file:': 'Name of the output file.', 
            'in_files': 'List of the input files.'})
def pdf_combine(out_file, *in_files):
    print( "out = %s" % out_file)
    print( "in = %s" % list(in_files))

以上只是我尝试过的众多变体之一,但 pyinvoke 似乎无法处理可变数量的参数。这是真的吗?

以上代码的结果是

$ invoke pdf_combine -o binder.pdf -i test.pdf test1.pdf
No idea what '-i' is!

类似的,如果我定义pdf_combine(out_file,in_file),in_file

前没有星号
$ invoke pdf_combine -o binder.pdf -i test.pdf test1.pdf
No idea what 'test1.pdf' is!

如果我只用一个 in_file 调用任务,如下所示 运行 OK。

$ invoke pdf_combine -o binder.pdf -i test.pdf
out = binder.pdf
in = ['t', 'e', 's', 't', '.', 'p', 'd', 'f']

我想看的是

$ invoke pdf_combine -o binder.pdf test.pdf test1.pdf test2.pdf
out = binder.pdf
in = [test.pdf test1.pdf test2.pdf]

我在 pyinvoke 的文档中找不到类似的东西,尽管我无法想象这个库的其他用户不需要调用具有可变数量参数的任务...

你可以这样做:

from invoke import task

@task
def pdf_combine(out_file, in_files):
    print( "out = %s" % out_file)
    print( "in = %s" % in_files)
    in_file_list = in_files.split(',')   # insert as many args as you want separated by comma

>> out = binder.pdf
>> in = test.pdf,test1.pdf,test2.pdf

其中 invoke 命令是:

invoke pdf_combine -o binder.pdf -i test.pdf,test1.pdf,test2.pdf

我无法通过阅读 pyinvoke 文档找到其他方法。

从版本 0.21.0 you can use iterable flag values 开始:

@task(
  help={
      'out-file': 'Name of the output file.', # `out-file` NOT `out_file`
      'in-files': 'List of the input files.'},
  iterable=['in_files'],
)
def pdf_combine(out_file, in_files):
    for item in in_files:
        print(f"file: {item}")

注意 help 使用破折号转换键,iterable 使用未转换的下划线键

NOTE 我知道上面的注释有点奇怪,所以我提交了一个 PR 因为作者非常棒,可能会考虑这个建议

以这种方式使用它允许这种类型的 cli:

$ invoke pdf-combine -o spam -i eggs -i ham
  file: eggs
  file: ham

$ invoke --help pdf-combine
Usage: inv[oke] [--core-opts] pdf-combine [--options] [other tasks here ...]

Docstring:
  none

Options:
  -i, --in-files                 List of the input files
  -o STRING, --out-file=STRING   Name of the output file.

注意 pdf_combine 任务是通过 CLI inv pdf-combine 调用的