如何在 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
调用的
我想在 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
调用的