如果我错了,请纠正我,但似乎单击装饰器掩盖了函数默认值和构造。从 REPL 调用包装的 from 不会立即以与 REPL 相同的方式工作。例如,从 dask 分布式中看到这个:
@click.option('--bokeh-prefix', type=str, default=None,
help="Prefix for the bokeh app")
@click.option('--preload', type=str, multiple=True, is_eager=True,
help='Module that should be loaded by each worker process '
'like "foo.bar" or "/path/to/foo.py"')
@click.argument('preload_argv', nargs=-1,
type=click.UNPROCESSED, callback=validate_preload_argv)
def main(scheduler, host, worker_port, listen_address, contact_address,
nanny_port, nthreads, nprocs, nanny, name,
memory_limit, pid_file, reconnect, resources, bokeh,
bokeh_port, local_directory, scheduler_file, interface,
death_timeout, preload, preload_argv, bokeh_prefix, tls_ca_file,
tls_cert, tls_key):
Run Code Online (Sandbox Code Playgroud)
是否有一些简单的模式可以获取该函数及其所有默认值?
python command-line-interface read-eval-print-loop python-click
我有一个 python click CLI。当我传递--help给任何命令时,它会打印一条我喜欢的帮助消息。我发现现在很多用户都在打字
mycli help foo
Run Code Online (Sandbox Code Playgroud)
代替
mycli foo --help
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以使前者像后者一样以通用方式对所有命令起作用?
该命令的实现大致如下
@click.group()
@click.pass_context
def cli(ctx):
ctx.obj = {}
@cli.command()
@click.argument('my_arg')
@click.pass_context
@report_errors
def foo(ctx, my_arg):
# some stuff here
Run Code Online (Sandbox Code Playgroud) 我编写了一个简单的命令行实用程序,它接受一个文本文件并使用 click 模块在其中搜索给定的单词。
sfind.py
import click
@click.command()
@click.option('--name', prompt='Word or string')
@click.option('--filename', default='file.txt', prompt='file name')
@click.option('--param', default=1, prompt="Use 1 for save line and 2 for word, default: ")
def find(name, filename, param):
"""Simple program that find word or string at text file and put it in new"""
try:
with open(filename) as f, open('result.txt', 'w') as f2:
count = 0
for line in f:
if name in line:
if param == 1:
f2.write(line + '\n')
elif param == 2:
f2.write(name + …Run Code Online (Sandbox Code Playgroud) Given that my library with foobar.py is setup as such:
\foobar.py
\foobar
\__init__.py
\setup.py
Run Code Online (Sandbox Code Playgroud)
Hierarchy of CLI in the console script:
foobar.py
\cli
\foo
\kungfu
\kungpow
\bar
\blacksheep
\haveyouanywool
Run Code Online (Sandbox Code Playgroud)
import click
CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
@click.group()
@click.version_option()
def cli():
pass
@cli.group(context_settings=CONTEXT_SETTINGS)
def foo():
pass
@cli.group(context_settings=CONTEXT_SETTINGS)
def bar():
pass
@foo.command('kungfu')
def kungfu():
print('bruise lee')
@foo.command('kungpow')
def kungpow():
print('chosen one')
@bar.command('blacksheep')
def blacksheep():
print('bah bah blacksheep')
@bar.command('haveyouanywool')
def haveyouanywool():
print('have you any wool?')
Run Code Online (Sandbox Code Playgroud)
How should I set my entry in setup.py …
在 Python 的Click包中,我可以为一个选项定义默认值:
@click.option("--count", default=1, help="Number of greetings.")
Run Code Online (Sandbox Code Playgroud)
我可以指定在帮助中显示默认值:
@click.option("--count", default=1, help="Number of greetings.", show_default=True)
Run Code Online (Sandbox Code Playgroud)
如果我有很多选择
@click.option("--count-a", default=1, help="...")
@click.option("--count-b", default=2, help="...")
@click.option("--count-c", default=4, help="...")
.
.
.
Run Code Online (Sandbox Code Playgroud)
我如何告诉 Click 一般在帮助中始终显示默认值(而不明确添加show_default=True到每个单独选项的参数列表中)?
我想用Python的Click库解析一些命令行参数,并将提供的值保存在一个对象中.
我的第一个猜测是这样做:
import click
class Configuration(object):
def __init__(self):
# configuration variables
self.MyOption = None
# method call
self.parseCommandlineArguments()
@click.command()
@click.option('--myoption', type=click.INT, default=5)
def parseCommandlineArguments(self, myoption):
# save option's value in the object
self.MyOption = myoption
# create an instance
configuration = Configuration()
print(configuration.MyOption)
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,而是我得到:
TypeError: parseCommandlineArguments() takes exactly 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)
显然,传递self给装饰函数并不是正确的方法.如果我self从方法参数中删除然后我可以做print(myoption),它将5在屏幕上打印,但我的Configuration()类的任何实例都不会知道该值.
处理这个问题的正确方法是什么?我认为它与Click中的上下文处理有关,但我无法根据提供的示例使其工作.
鉴于我有这样的代码:
columns = ['col1', 'col2', 'col3', 'col4']
@click.option('--columns', is_flag=False,
default=columns, show_default=True, metavar='<columns>', type=click.Choice(columns),
help='Sets target columns', multiple=True)
Run Code Online (Sandbox Code Playgroud)
然后,我可以这样调用我的应用程序:
./myapp --columns=col1
Run Code Online (Sandbox Code Playgroud)
但是,如何使多个项目之间用逗号分隔,如下所示:
./myapp --columns=col1,col3
Run Code Online (Sandbox Code Playgroud)
我的目标是从结果columns数组中检索传递的值['col1', 'col3']。
我不想多次通过该选项。
我正在为 CLI 应用程序使用 click 库。我有用户可以指定的各种选项,其中大多数都打开了提示。但是,即使不需要某个选项,如果您设置单击以提示该选项,它也不会接受空响应(例如直接按回车键)。例如:
@click.option('-n', '--name', required=True, prompt=True)
@click.option('-d', '--description', required=False, prompt=True)
>>> myscript -n Joe
>>> Description: [Enter pressed]
>>> Description: [Enter pressed; click doesn't accept an empty parameter]
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题,或者这是否需要功能请求?
使用 python click 时,我无法将选项传递给其中一种方法。请考虑以下代码。
import click
@click.command()
@click.option('--config', default='default.cfg', help = 'comfiguration file')
@click.option('--port', default=9093)
def foo(config_name, port):
print('Function has been successfully called..!')
if __name__ == '__main__':
foo()
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
TypeError: foo() got an unexpected keyword argument 'config
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪是:
Traceback (most recent call last):
File "temp.py", line 10, in <module>
foo()
File "/home/sagar/anaconda3/lib/python3.6/site-packages/click/core.py", line 722, in __call__
return self.main(*args, **kwargs)
File "/home/sagar/anaconda3/lib/python3.6/site-packages/click/core.py", line 697, in main
rv = self.invoke(ctx)
File "/home/sagar/anaconda3/lib/python3.6/site-packages/click/core.py", line 895, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/sagar/anaconda3/lib/python3.6/site-packages/click/core.py", line …Run Code Online (Sandbox Code Playgroud) 我的 Click 7.0 应用程序有一组,有多个命令,由主cli函数调用,如下所示:
import click
@click.group()
@click.pass_context
def cli(ctx):
"This is cli helptext"
click.echo('cli called')
click.echo('cli args: {0}'.format(ctx.args))
@cli.group(chain=True)
@click.option('-r', '--repeat', default=1, type=click.INT, help='repeat helptext')
@click.pass_context
def chainedgroup(ctx, repeat):
"This is chainedgroup helptext"
for _ in range(repeat):
click.echo('chainedgroup called')
click.echo('chainedgroup args: {0}'.format(ctx.args))
@chainedgroup.command()
@click.pass_context
def command1(ctx):
"This is command1 helptext"
print('command1 called')
print('command1 args: {0}'.format(ctx.args))
@chainedgroup.command()
@click.pass_context
def command2(ctx):
"This is command2 helptext"
print('command2 called')
print('command2 args: {0}'.format(ctx.args))
Run Code Online (Sandbox Code Playgroud)
跑:
$ testcli --help
$ testcli chainedgroup --help
$ …Run Code Online (Sandbox Code Playgroud)