我想使用python-click库向cli命令添加未指定的选项.所以我的cli功能可能如下所示
$ my-cmd --option1 value1 --options2 value2 --unknown_var value3
Run Code Online (Sandbox Code Playgroud)
我目前的代码:
import click
@click.option('--option1')
@click.option('--option2')
@click.command(name='my-cmd')
def cli(option1, option2):
click.echo("my test")
Run Code Online (Sandbox Code Playgroud)
我希望看到如下内容:
import click
@click.option('--option1')
@click.option('--option2')
@click.command(name='my-cmd')
def cli(option1, option2, **kwargs):
click.echo("my test")
# Manually manage **kwargs
Run Code Online (Sandbox Code Playgroud) 我使用优秀的Python Click库来处理我的工具中的命令行选项.这是我的代码的简化版本(这里是完整的脚本):
@click.command(
context_settings = dict( help_option_names = ['-h', '--help'] )
)
@click.argument('analysis_dir',
type = click.Path(exists=True),
nargs = -1,
required = True,
metavar = "<analysis directory>"
)
def mytool(analysis_dir):
""" Do stuff """
if __name__ == "__main__":
mytool()
Run Code Online (Sandbox Code Playgroud)
如果有人在没有任何标志的情况下运行命令,则会收到默认的单击错误消息:
$ mytool
Usage: mytool [OPTIONS] <analysis directory>
Error: Missing argument "analysis_dir".
Run Code Online (Sandbox Code Playgroud)
这很好,但我非常想告诉(非常)新手用户使用help标志可以获得更多帮助.换句话说,当命令无效时,向错误消息添加自定义句子,告诉人们尝试mytool --help获取更多信息.
是否有捷径可寻?我知道我可以删除required属性并在main函数中处理这个逻辑,但是对于这样一个小的添加感觉有点hacky.
说我的CLI实用程序有三个命令:cmd1,cmd2,cmd3
我想cmd3有相同的选项和标志为cmd1和cmd2.像某种继承.
@click.command()
@click.options("--verbose")
def cmd1():
pass
@click.command()
@click.options("--directory")
def cmd2():
pass
@click.command()
@click.inherit(cmd1, cmd2) # HYPOTHETICAL
def cmd3():
pass
Run Code Online (Sandbox Code Playgroud)
所以cmd3会有标志--verbose和选项--directory.可以用Click做到这一点吗?也许我只是忽略了文档中的内容......
编辑:我知道我可以这样做click.group().但是,必须在组命令之前指定所有组的选项.我想在命令之后通常拥有所有选项.
cli.py --verbose --directory /tmp cmd3 - > cli.py cmd3 --verbose --directory /tmp
如何为同一选项指定短选项和长选项?例如,对于以下内容,我也想-c用于--count:
import click
@click.command()
@click.option('--count', default=1, help='count of something')
def my_command(count):
click.echo('count=[%s]' % count)
if __name__ == '__main__':
my_command()
Run Code Online (Sandbox Code Playgroud)
例如,
$ python my_command.py --count=2
count=[2]
$ python my_command.py -c 3
count=[3]
Run Code Online (Sandbox Code Playgroud)
我使用app工厂模式定义我的Flask应用程序.使用Flask-Script时,我可以将工厂函数传递给Manager.我想改用Flask的内置Click CLI.如何使用Click工厂?
我当前的代码使用Flask-Script.如何使用Click执行此操作?
from flask import Flask
from flask_script import Manager, Shell
def create_app():
app = Flask(__name__)
...
return app
manager = Manager(create_app)
def make_shell_context():
return dict(app=app, db=db, User=User, Role=Role)
manager.add_command('shell', Shell(make_context=make_shell_context))
if __name__ == '__main__':
manager.run()
Run Code Online (Sandbox Code Playgroud) python command-line-interface flask flask-script python-click
我有一个函数,使用click打包为命令。所以看起来像这样:
@click.command()
@click.option('-w', '--width', type=int, help="Some helping message", default=0)
[... some other options ...]
def app(width, [... some other option arguments...]):
[... function code...]
Run Code Online (Sandbox Code Playgroud)
我对此功能有不同的用例。有时,可以通过命令行调用它,但是有时候我也想直接调用该函数
from file_name import app
width = 45
app(45, [... other arguments ...])
Run Code Online (Sandbox Code Playgroud)
我们该怎么做?我们如何使用click调用已包装为命令的函数?我找到了这篇相关的文章,但是我不清楚如何使它适应我的情况(即,从头开始构建Context类并在click命令功能之外使用它)。
编辑:我应该提到:我不能(轻松)修改包含要调用的函数的程序包。因此,我正在寻找的解决方案是如何从呼叫方进行处理。
我想制作一个模块,以使其非常容易构建具有许多选项的点击命令。这些选项将被提炼成传递给命令的单个对象。作为说明性示例:
from magic import magic_command
import click
@magic_command('Colored')
@click.option('--color')
def cmd(magic, color):
pass
Run Code Online (Sandbox Code Playgroud)
然后,total命令将有许多--magic-...选项magic传递到传递给的对象中cmd。我能够使用以下方法实现这一目标:
def magic_command(name):
def decorator(func):
@click.option('--magic-foo')
@click.option('--magic-bar')
def wrapper(magic_foo, magic_bar, **kwargs):
print(f'initializing Magic with {magic_foo} and {magic_bar}')
magic = Magic(magic_foo, magic_bar)
func(magic, **kwargs)
try:
wrapper.__click_params__.extend(func.__click_params__)
except AttributeError:
pass
return click.command(f'{name}-Magic')(wrapper)
return decorator
Run Code Online (Sandbox Code Playgroud)
但是,将其弄乱__click_params__似乎并不是特别干净。
这个问题有点类似于这个问题,但是这种方法不允许我将许多魔术选项浓缩为一个魔术对象。
详细说来,我将不得不这样做
@magic_command('Colored')
@click.option('--color')
def cmd(magic_foo, magic_bar, color):
magic = Magic(magic_foo, magic_bar)
pass
Run Code Online (Sandbox Code Playgroud)
但这意味着自定义代码需要知道存在哪些魔术选项以及如何构造魔术。我想可以使用简化此操作,**kwargs但理想情况下,我只想将就绪magic对象传递给cmd。
在 python 3.8 中,我想定义一些多个命令通用的单击选项。我尝试了以下代码:
import click
@click.group()
@click.option(
"-v",
"--verbose",
count=True,
default=0,
help="-v for DEBUG",
)
@click.option(
"--path",
help="Main Path.",
)
def cli():
pass
@click.command("list")
@click.option(
"--list-option",
help="Special option for list command.",
)
def my_list_command(verbose, path, list_option):
print(verbose, path, list_option)
@click.command("find")
@click.option(
"--find-option",
help="Special option for find command.",
)
def my_find_command(verbose, path, find_option):
print(verbose, path, find_option)
cli.add_command(my_list_command)
cli.add_command(my_find_command)
if __name__ == '__main__':
cli()
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行命令时
python script.py list
Run Code Online (Sandbox Code Playgroud)
我收到一个错误
TypeError: cli() got an unexpected keyword argument 'verbose'
Run Code Online (Sandbox Code Playgroud)
我想要的是该命令list具有以下三个选项:verbose …
如何在帮助文本中Click显示a的默认输入值@click.option(),以便在调用程序时打印--help?
我有这段代码:
import click
@click.option('--delete_thing', help="Delete some things columns.", default=False)
def cmd_do_this(delete_thing=False):
print "I deleted the thing."
Run Code Online (Sandbox Code Playgroud)
我想重命名 中的选项变量--delete-thing。但是Python不允许变量名中出现破折号。有没有办法编写这种代码?
import click
@click.option('--delete-thing', help="Delete some things columns.", default=False, store_variable=delete_thing)
def cmd_do_this(delete_thing=False):
print "I deleted the thing."
Run Code Online (Sandbox Code Playgroud)
所以delete_thing将被设置为值delete-thing