Выполнить только последнюю команду во вложенном списке групп в python click

#python #python-click

#python #python-щелчок

Вопрос:

Я создаю глубоко вложенный набор команд как click.group(). Я хотел бы выполнить ТОЛЬКО последний ввод группы (команды) в cli, когда я нажимаю Enter клавишу.

Например:

 cli sub_command subsub_command # < -- should only execute subsub_command
  

… однако следует выполнить ТОЛЬКО последнюю команду subsub_command , похоже, что click хочет выполнить полный стек команд. (как ни странно, это исключает subsub_command ?):

 $ cli sub-command subsub-command 
I am the root_command
I am sub_command
Usage: cli sub-command subsub-command [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.
  

Также кажется, что он выполняет все, КРОМЕ последней команды. Почему он отображает справку subsub_command вместо простого ее выполнения?

Вот мой код щелчка:

 import os
import sys

import click

@click.group(invoke_without_command=True)
def cli():
    print('I am the root_command')

@cli.group()
def sub_command(invoke_without_command=True):
    print('I am sub_command')

@sub_command.group()
def subsub_command(invoke_without_command=True):
    print('I am the subsub_command')

if __name__ == '__main__':
    cli()
  

Любые мысли полезны. Спасибо!

Ответ №1:

Это потому, что вы используете @cli.group снова и снова.

Команды определяются с помощью @cli.command

Так, например:

 import click


@click.group()
def cli():
    pass


@cli.command(name='hello')
def hello():
    print('hello world!')
  

Идея @group состоит в том, чтобы объединить несколько команд вместе, метод group используется для определения общего контекстного кода для всей группы.

Комментарии:

1. @orvelli — Спасибо! да, я хочу использовать click.group просто как иерархию. В этом примере это не показано, но я генерирую эти команды / группы динамически, поэтому я не буду заранее знать, что такое лист / команда и что такое группа. Я надеялся, что смогу просто ввести произвольную команду глубины и заставить ее выполнить команду на этом уровне. В основном это дерево исполняемых click.group файлов. Есть идеи?

2. Каков вариант использования генерации динамических команд?

3. В любом случае, вы всегда можете использовать sys.argv[-1] для получения последнего имени подкоманды. Вам нужно будет добавить условие для каждой группы, чтобы проверить, нужно ли вам выполнять код

4. похоже class Multicommand , что имеет invoke_without_command значение, но это, похоже, не имеет никакого значения.

5. Вариант использования заключается в том, что у меня есть уже сгенерированное, довольно сложное дерево узлов в пользовательском объекте, которое я передаю для генерации команд. Каждый узел содержит kwargs и исполняемый код. в конечном счете, я буду вызывать mylib.execute(path="|cli|sub_command|subsub_command") этот путь, указанный cli.