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

时间:2016-03-03 12:11:13

标签: python 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的文档中找不到类似的东西,虽然我无法想象这个库的其他用户不需要使用可变数量的参数调用任务...

2 个答案:

答案 0 :(得分:4)

您可以这样做:

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文档。

答案 1 :(得分:1)

0.21.0版开始,您可以使用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使用未转换的下划线键

注意,我知道上面的注释有点奇怪,所以我提交了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调用

注意inv pdf-combine任务