我一直在使用click来制作一个命令行程序.现在我正以非常文本的方式实现交互式菜单.例如:
1-option #1
2-option #2
Enter the index of the option you want to select:
Run Code Online (Sandbox Code Playgroud)
但我希望以更优雅和互动的方式做到这一点.例如,我喜欢Yeoman实现其菜单的方式.这是菜单的实际应用.

是否有任何python库让我们构建这样的命令行菜单?我看过curses,cmd等库.但它们似乎给你一个完整的单独窗口来管理和看起来有点unpythonic.
我在virtualenv下使用Click并使用entry_pointsetuptools中的指令将根映射到一个名为dispatch的函数.
我的工具公开两个子serve和config,我使用在顶级组的选项,以确保用户总是通过一个--path指令.但用法结果如下:
mycommand --path=/tmp serve
Run Code Online (Sandbox Code Playgroud)
无论是serve和config子命令需要确保用户始终在传递路径和理想,我想目前的CLI为:
mycommand serve /tmp` or `mycommand config validate /tmp
Run Code Online (Sandbox Code Playgroud)
当前基于Click的实现如下:
# cli root
@click.group()
@click.option('--path', type=click.Path(writable=True))
@click.version_option(__version__)
@click.pass_context
def dispatch(ctx, path):
"""My project description"""
ctx.obj = Project(path="config.yaml")
# serve
@dispatch.command()
@pass_project
def serve(project):
"""Starts WSGI server using the configuration"""
print "hello"
# config
@dispatch.group()
@pass_project
def config(project):
"""Validate or initalise a configuration file"""
pass
@config.command("validate")
@pass_project
def config_validate(project):
"""Reports on the validity of …Run Code Online (Sandbox Code Playgroud) click是用于开发CLI应用程序的流行Python库。sphinx是用于记录Python软件包的流行库。一些人面临的一个问题是集成这两个工具,以便它们可以为基于单击的命令生成Sphinx文档。
我最近遇到了这个问题。我用click.command和装饰了一些函数,click.group向它们添加了文档字符串,然后使用Sphinx的autodoc扩展为其生成了HTML文档。我发现它省略了这些命令的所有文档和参数说明,因为它们在Commandautodoc到达时已被转换为对象。
我如何修改代码,以使命令的文档既可以供最终用户在--helpCLI上运行时使用,又可以供浏览Sphinx生成的文档的人员使用?
python documentation command-line-interface python-sphinx python-click
我的程序使用Click进行命令行处理。它有一个带有必需参数的主命令。此命令具有采用可选参数的子命令。不同的子命令采用不同的选项,但它们都需要来自其父命令的相同参数。我想让命令行看起来像这样:
python myprogram.py argument-value subcommand1 --option-1=value
Run Code Online (Sandbox Code Playgroud)
我可以像这样使用 Click 写这个
import click
@click.group()
@click.argument("argument")
@click.pass_context
def main(context, argument):
"""ARGUMENT is required for both subcommands"""
context.obj = {"argument": argument}
@click.command()
@click.option("--option-1", help="option for subcommand 1")
@click.pass_context
def subcommand1(context, option_1):
print("subcommand 1: %s %s" % (context.obj["argument"], option_1))
@click.command()
@click.option("--option-2", help="option for subcommand 2")
@click.pass_context
def subcommand2(context, option_2):
print("subcommand 2: %s %s" % (context.obj["argument"], option_2))
main.add_command(subcommand1)
main.add_command(subcommand2)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
顶级帮助信息正是我想要的。
python myprogram.py --help
Usage: myprogram.py [OPTIONS] ARGUMENT COMMAND [ARGS]... …Run Code Online (Sandbox Code Playgroud) 我有一个tool命令:step1,step2和step3.
我可以通过调用来链接它们:
$ tool step1 step2 step3
我希望有一个命名的别名all,通过调用来运行所有步骤:
$ tool all
我找到了一个有效的解决方案,但由于cli()在引擎盖下两次调用,它似乎不适合我:
@click.group(chain=True)
def cli():
print('cli() has been called')
...
@cli.command()
def all():
cli(args=['step1', 'step2', 'step3'])
Run Code Online (Sandbox Code Playgroud)
如果没有cli()两次调用的副作用,怎么办呢?
默认情况下,我的脚本在没有提供参数时不显示任何内容duh.py:
import click
CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
@click.command(context_settings=CONTEXT_SETTINGS)
@click.option('--toduhornot', is_flag=True, help='prints "duh..."')
def duh(toduhornot):
if toduhornot:
click.echo('duh...')
if __name__ == '__main__':
duh()
Run Code Online (Sandbox Code Playgroud)
$ python3 test_click.py -h
Usage: test_click.py [OPTIONS]
Options:
--toduhornot prints "duh..."
-h, --help Show this message and exit.
$ python3 test_click.py --toduhornot
duh...
$ python3 test_click.py
Run Code Online (Sandbox Code Playgroud)
如上图,默认不打印信息python3 test_click.py。
有没有办法,-h如果没有给出参数,则默认选项设置为,例如
$ python3 test_click.py
Usage: test_click.py [OPTIONS]
Options:
--toduhornot prints "duh..."
-h, --help Show this message and exit.
Run Code Online (Sandbox Code Playgroud) 我的命令行界面使用 Python Click 库。我想要一个接受多个键值对的命令。我在 api 上很灵活。例如
my_cli my_command FOO=1 BAR=2
Run Code Online (Sandbox Code Playgroud)
或者可能
my_cli my_command FOO 1 BAR 2
Run Code Online (Sandbox Code Playgroud)
甚至
my_cli my_command {"FOO": 1, "BAR": 2}
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以通过 Click 做到这一点?
有没有一种方法可以使用click为所有命令和子命令生成(和导出)帮助文档?
例如,
cli --help all --destination help-docs.txt
将在命令之后生成命令和子命令的帮助
cli command subcommand
格式化并放入help-docs.txt文件中。
我认为可以完成此操作的唯一方法是使用
cli command subcommand --help
我想要为其生成帮助并将cat其输出到文件的每个子命令,但是如果有一种更简单的方法来使用Click --help功能来完成此操作,那将是很好的选择。
这个问题是关于点击包的:
/b也尝试过使用,但似乎影响不大。cmdpowershell相同的代码有不同的结果,为什么?import click
def command_required_option_from_option(require_name, require_map):
class CommandOptionRequiredClass(click.Command):
def invoke(self, ctx):
require = ctx.params[require_name]
if require not in require_map:
raise click.ClickException(
"Unexpected value for --'{}': {}".format(
require_name, require))
if ctx.params[require_map[require]] is None:
raise click.ClickException(
"With {}={} must specify option --{}".format(
require_name, require, require_map[require]))
super(CommandOptionRequiredClass, self).invoke(ctx)
return CommandOptionRequiredClass
required_options = {
1: 'gs', # generator_string
2: 'nosp', # number_of_sample_points
3: 'nocp', # number_of_center_points
}
@click.command(context_settings=dict(max_content_width=800), cls=command_required_option_from_option('doe', required_options))
@click.option('--input', required=True, type=click.Path(exists=True), metavar='FILE', …Run Code Online (Sandbox Code Playgroud) 我的 Python 脚本有一个名为Command. 我想将我的类的方法作为 CLI 命令调用(类似于python cli-comand.py net get-public-ip)。
我使用了Pythonclick库,但是当我尝试执行它时,它抛出了错误TypeError: get_public_ip() missing 1 required positional argument: 'self'。
果然,我没能通过self。有什么方法可以将参数传递到类方法中,或者任何其他方法吗? click主要与函数一起使用。
我的Python脚本如下:
cli命令.py
import click
import urllib.request
from typing import List, AnyStr
from urllib.error import URLError
from ttn_cli.utils.constants import FETCH_PUBLIC_IP_URL
@click.group()
def cli():
"""
This is the root function of cli module.
"""
pass
@cli.group()
def net():
"""
function act as a group which is linked to root cli function.
""" …Run Code Online (Sandbox Code Playgroud)