Вызов другой команды и получение пользовательского ввода из командной строки

#python #python-click

#python #python-щелчок

Вопрос:

Я пытаюсь создать интерактивное меню с помощью py-click. В основном просто структура, которая:

  • Список доступных команд из текущего меню (с использованием группы щелчков)
  • Предоставьте пользователю команду, которая запрашивает его выбор (пользователи вводят имя # / cmd)
  • Вызовите команду из этого меню выбора
  • Эти команды могут привести либо к другому меню, либо к выполнению кода приложения
  • Затем вернитесь в главное меню / предыдущее меню по мере необходимости после запуска кода

Мой код:

 import click

@click.group(invoke_without_command=True)
@click.pass_context
def main_group(ctx):
    """ Lists all the submenu options available"""
    cmds    = main_group.list_commands(ctx)
    click.echo(f"Available options:")
    for idx, cmd_str in enumerate(cmds):
        click.echo(f"{idx}:{cmd_str}")

    click.echo(f"Now that you know all the options, let's make a selection:")
    ctx.invoke(main_group.get_command(ctx, "selection"))

@main_group.command()
@click.option('--next_cmd', prompt='Next command:', help="Enter the number corresponding to the desired command")
@click.pass_context
def selection(ctx, next_cmd):
    click.echo(f"You've selected {next_cmd}")

    # check that selection is valid

    # invoke the desired command

    # return to parent previous command


@main_group.command()
def submenu_1():
    click.echo('A submenu option ')

@main_group.command()
def submenu_2():
    click.echo('Another option')




if __name__ == '__main__':
    main_group()
  

Однако вывод из приведенного выше:

 Available options:
0:application-code
1:selection
2:submenu-1
3:submenu-2
Now that you know all the options, let's make a selection:
You've selected None

Process finished with exit code 0
  

По сути, приглашение из команды выбора не имеет никакого эффекта. Но сама команда выбора работает, потому что, если я запускаю ее напрямую:

 if __name__ == '__main__':
    # main_group()
    selection()
  

затем мне фактически предлагается мой выбор. Итак … почему приглашение игнорируется? Или основная предпосылка, лежащая в основе моего подхода к созданию этой проблемы, например, Click не предназначен для этого?

РЕДАКТИРОВАТЬ: просматривая кучу репозиториев git, использующих эту библиотеку, включая примеры, которые они предоставляют, я не смог найти ни одного, который строил бы структуру, несколько похожую на то, что я хочу. По сути, парадигма создания click-приложения представляет собой изолированную команду, которая выполняет действие, изменяющее состояние чего-либо, а не столько навигацию по меню, предлагающему различные опции. Не сказать, что это невозможно, но, похоже, это тоже не поддерживается из коробки.

Ответ №1:

На этот вопрос ответов не дано. Я потратил на это еще немного времени. Я немного продвинулся в этом, но я все еще не могу получить что-то вроде:

 Main Menu
 - Option 1
 - Option 2
 - Option 3
 - Submenu 1
  

и затем

 Submenu 1
 - Option 1 
 - Option 2
 - Submenu 2
 - Back to Main
  

и т.д. Я пришел к выводу, что click не является подходящим инструментом для этого. На самом деле, я не уверен, что альтернатива обязательно сделает это намного проще (argparse, docopt, …). Возможно, для этого лучшим подходом было бы просто создать структуру классов самостоятельно.

Или затем используйте подход, который ближе к тому, что использует оболочка или docker, не беспокойтесь о какой-либо навигации по меню и просто запускайте атомарные команды, которые влияют на состояние приложения.

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

1. привет, вы смогли добиться какого-либо прогресса?