5

问题

使用python click 库创建命令行工具时,是否可以将未知数量的参数传递给函数?我正在考虑类似于 *args 命令的东西。

用例

我正在尝试为catkin构建一个包装器,并希望将 click 用于它附带的所有不错的实用程序。在使用指定命令调用 catkin 之前,此应用程序应该执行一些任务,例如切换到工作空间的根目录。例如catkin build编译代码。这样做的问题是,我不想显式声明可以传递给 catkin 的每个可能的编译标志,而是只想查看实际命令并将所有参数直接传递给 catkin。

例子

到目前为止,我发现可以使用选项定义最后一个参数,该选项nargs=-1将收集此变量中的所有后续参数。通过这种方式,您可以收集例如几个文件名。这几乎是我正在寻找的,除了它不会接受以 dash 开头的标志-。它会从一个错误说Error: no such option: -a

#!/usr/bin/python
import click
import subprocess

@click.command()
@click.argument('action', type=click.STRING)
@click.option('--debug', is_flag=True, help='Build in debug mode.')
@click.argument('catkin_args', nargs=-1, type=click.STRING)
def main(action, debug, catkin_args):
    """ A wrapper for catkin """

    # Do something here ...

    if debug:
        # Do some more special things...

    subprocess.call(["catkin"] + catkin_args)

4

1 回答 1

2

根据文档,点击 4.0+ 是可能的;你只需要设置type你的catkin_argsto click.UNPROCESSED
文档有一个示例包装timeit,就像你描述的你想用 catkin 做的那样。

于 2015-09-13T17:22:41.123 回答