调用另一个命令并从提示中获取用户输入

时间:2020-10-30 19:47:14

标签: python python-click

我正在尝试使用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()

然后实际上会提示我选择。那么...为什么提示被忽略?还是我解决这个问题的方法的基本前提,例如点击不是为了这个吗?

编辑: 通过使用该库的一堆git repo,包括它们的示例provide,我一直找不到能够构建出与我想要的结构类似的结构的任何git repo。基本上,构建单击应用程序的范例似乎是隔离的命令,该命令执行的操作会更改某些内容的状态,而不是通过提供不同选项的菜单进行导航。并不是说这是不可能的,但似乎也不是立即可用的。

1 个答案:

答案 0 :(得分:0)

此问题没有答案。我花了更多时间在此上。我在这方面取得了一些进展,但仍然无法完成以下操作:

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

然后

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

等我的结论是,点击并不是用于此目的的正确工具。实际上,我不确定替代方案是否一定会使它容易得多(argparse,docopt等)。也许这样做的最好方法就是自己构建一个类结构。

或者,然后,采用一种更接近于shell或docker使用的方法,不要理会任何菜单导航,而只是启动对应用程序状态起作用的原子命令。

相关问题