#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.