标签: python-click

如何从 python 中调用 python click ?

如果我错了,请纠正我,但似乎单击装饰器掩盖了函数默认值和构造。从 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

3
推荐指数
1
解决办法
4186
查看次数

Python Click:如何实现类似于“--help”的帮助命令?

我有一个 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)

python python-click

3
推荐指数
1
解决办法
3263
查看次数

单击模块的单元测试

我编写了一个简单的命令行实用程序,它接受一个文本文件并使用 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)

python python-unittest python-click

3
推荐指数
1
解决办法
1866
查看次数

How to set entry point for console script with multiple command groups for Python Click?

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)

[code]:

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 console command-line setuptools python-click

3
推荐指数
1
解决办法
2310
查看次数

如何告诉单击始终显示选项默认值

在 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 command-line-interface python-click

3
推荐指数
2
解决办法
580
查看次数

使用Python的Click库在对象中保存命令行选项的值

我想用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中的上下文处理有关,但我无法根据提供的示例使其工作.

python command-line-arguments python-click

2
推荐指数
1
解决办法
1667
查看次数

如何通过数组验证提供多个选项?

鉴于我有这样的代码:

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']

我不想多次通过该选项。

python python-click

2
推荐指数
1
解决办法
3178
查看次数

Python click - 允许提示为空

我正在为 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 command-line-interface python-click

2
推荐指数
1
解决办法
3079
查看次数

Python 多个 click.options - 得到了意外的关键字参数

使用 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)

python python-click

2
推荐指数
1
解决办法
2185
查看次数

如何检测何时调用了“--help”?

我的 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)

python command-line-interface python-click

2
推荐指数
1
解决办法
322
查看次数