首页 > 解决方案 > Python, CLI, Click: 传递我自己的 argv 列表

问题描述

有没有办法sys.argv用我自己的列表替换由click提供支持的实用程序?这argparse很容易,看起来像这样:

def _retrieve_args(argv: List[str]) -> Any:
    parser = argparse.ArgumentParser(
    ...
    args = parser.parse_args(argv)
    ...
    return args

那么你可以做任何你想做的事:

ARGS = _retrieve_args(sys.argv[1:])

或者

ARGS = _retrieve_args(['-v', '--count', '4', '.'])

如果需要的话。

有可能click吗?

我不知道在sys.argv特征click设置中插入的位置:

@click.command(context_settings=dict(help_option_names=["-h", "--help"]))
@click.option(
    "-p", "--pretty", is_flag=True, help=click.style("Pretty output.", fg="green")
)
@click.option(
    "-e",
    "--file-type",
    type=str,
    default=None,
    help="Accept only specified audio files.",
)
@click.option(
    "-b",
    "--album-num",
    type=int,
    default=None,
    help="Prepend INTEGER to the destination root directory name.",
)
@click.argument("tgt_dir", type=click.Path(exists=True, resolve_path=True))
def main(*, version="", **kwargs):
"""
My utility.
"""
print(f'version: "{version}"')
for key, val in kwargs.items():
    print(f"key: {key}, val: {val}")

升级版:

测试框架与我想要的非常接近:

from click.testing import CliRunner

def run(*, argv: List[str]):
    runner = CliRunner()
    result = runner.invoke(main, argv)
    print(result.output)

我可以main像这样或多或少地调用该函数而没有不必要的测试开销吗?特别是没有存储result.output

标签: pythoncommand-line-argumentsargparse

解决方案


推荐阅读