python - 我可以有一个 main() Click 函数来调用所有其他子命令吗?

标签 python python-3.x python-click

我有一个像这样的脚本:

#myscript.py
import click

def step1(arg1):
    print('Step 1: ' + arg1)

def step2(arg2):
    print('Step 2: ' + arg2)

def main(arg1, arg2):
    step1(arg1)
    step2(arg2)

大多数时候我想使用myscript arg1 arg2运行脚本,但有时我可能只想运行一个步骤:例如myscript step1 arg1如何设置点击来执行此操作?有没有一种方法可以使用一个默认命令,然后使用其他可选命令?

这似乎是 Click discourages一件事 :

Sometimes, it might be interesting to invoke one command from another command. This is a pattern that is generally discouraged with Click, but possible nonetheless.

我需要使用此 click.invoke() 模式吗?

最佳答案

我认为Multi Command ChainingMulti Command Pipelines功能旨在解决这种情况。管道提供了所请求的确切行为(当命令行上没有给出任何内容时调用 step1step2),但它更详细,并且使用 chain=True 没有一个参数是可选的;您必须 (a) 始终同时给出 arg1arg2,即使仅调用 step2 时也是如此;或 (b) 将这些参数转换为选项(--arg1 foo 而不是 foo)。

链接

import click

@click.group(chain=True)
def cli():
    pass

@cli.command()
@click.argument('arg1')
def step1(arg1):
    click.echo('Step 1: ' + arg1)

@cli.command()
@click.argument('arg2')
def step2(arg2):
    click.echo('Step 2: ' + arg2)

cli()

然后:

$ python3 chain.py step1 foo step2 bar
Step 1: foo
Step 2: bar
$ python3 chain.py step2 bar
Step 2: bar

流水线

import click

@click.group(chain=True, invoke_without_command=True)
@click.argument('arg1')
@click.argument('arg2')
def cli(arg1, arg2):
    pass

@cli.resultcallback()
def process_pipeline(processors, **kwargs):
    # If no commands given, invoke step1 then step2
    processors = processors if len(processors) else [step1, step2]
    for processor in processors:
        processor(**kwargs)

def step1(**kwargs):
    click.echo('Step 1: ' + kwargs['arg1'])

def step2(**kwargs):
    click.echo('Step 2: ' + kwargs['arg2'])

@cli.command('step1')
def make_step1():
    return step1

@cli.command('step2')
def make_step2():
    return step2

cli()

然后

$ python3 pipeline.py foo bar
Step 1: foo
Step 2: bar
$ python3 pipeline.py foo bar step2
Step 2: bar

关于python - 我可以有一个 main() Click 函数来调用所有其他子命令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50375465/

相关文章:

python - 安装py2cairo的步骤?

python - 使用 selenium webdriver 等待元素的属性更改值

python - 为什么 __setitem__ 比 cdef 类的等效 "normal"方法快得多?

python - 如何使用 python-click 在同一组中对 cmd 使用相同的选项

python - 重命名 python 单击参数

python - 将 click.command 的结果传递给另一个函数

python - 列表理解中python中的递归函数调用给出的结果与首先将调用结果分配给变量不同

python - Haystack-Django 模板不存在于/search/Error

python - 捕获对齐的、固定宽度的整数字段的表达式,在无效的后续字符上失败

python-3.x - python 3.5 urllib.request.Request POST 数据到网站。执行 GET 而不是 POST