标签: python-click

点击不会让我传递多个文件,尽管它应该是可能的

我正在尝试使用click来存储多个文件.例如:

@cli.command("test")
@click.argument('input', type=click.File('rb'))
def test(input):
    with click.progressbar(input, label='READING') as bar:
        for x in bar:
            pass
Run Code Online (Sandbox Code Playgroud)

当我做这样的事情时:

script test ~/ololo/*
Run Code Online (Sandbox Code Playgroud)

我明白了:

Error: Got unexpected extra arguments ( ... listing all files in folder ...)
Run Code Online (Sandbox Code Playgroud)

python python-click

5
推荐指数
1
解决办法
1302
查看次数

Python单击"库重命名参数"

我使用的Click库,但我似乎无法找到类似行为destargparse.

例如,我有

@click.option('--format', type=click.Choice(['t', 'j']))
def plug(format):
  pass
Run Code Online (Sandbox Code Playgroud)

请注意,我使用的标志--format被转换为内置的Python构造format,这是不理想的.

有没有办法更改传递给选项的click函数的参数?

python python-click

5
推荐指数
2
解决办法
2265
查看次数

Python单击传递未指定数量的kwarg

最近发现的click,我想将不确定数量的kwargs传递给click命令。目前,这是我的命令:

@click.command()
@click.argument('tgt')
@click.argument('fun')
@click.argument('args', nargs=-1)
def runner(tgt, fun, args):
    req = pyaml.p(meh.PostAdapter(tgt, fun, *args))
    click.echo(req)
Run Code Online (Sandbox Code Playgroud)

但是,当使用nargs时,将多于1的任何值作为元组([docs] [1])传递,但是我不能那样type=dict做。

但是应该可以这样做:

command positional1 positional2 foo='bar' baz='qux' xxx='yyy'

在此先感谢您提供的任何帮助或建议,与此同时,我将自己继续努力。

python dictionary kwargs python-click

5
推荐指数
1
解决办法
2751
查看次数

python click中的意外关键字参数

@click.group(context_settings=dict(help_option_names=['-h', '--help']))
def plot_glm():
    pass

@plot_glm.command()
@click.argument('path_nc')
@click.argument('out_path')
@click.argument('var_name')
@click.option('--xaxis_min', default=0.0, help='')
@click.option('--xaxis_max', default=1.1, help='')
@click.option('--xaxis_step', default=0.1, help='')
@click.option('--annotate_date', help='')
@click.option('--yr', default=0, help='')
@click.option('--date', default=-1, help='')
@click.option('--xlabel', default='', help='')
@click.option('--title', default='', help='')
@click.option('--tme_name', default='time', help='')
@click.option('--show_plot', help='')
@click.option('--any_time_data', help='')
@click.option('--format', default='%.2f', help='')
@click.option('--land_bg', help='')
@click.option('--cmap', default=plt.cm.RdBu, help='')
@click.option('--grid', help='')
@click.option('--fill_mask', help='')
def plot_map_from_nc(path_nc, out_path, var_name, xaxis_min=0.0, xaxis_max=1.1, xaxis_step=0.1,
                     annotate_date=False, yr=0, date=-1, xlabel='', title='', tme_name='time', show_plot=False,
                     any_time_data=True, format='%.2f', land_bg=True, cmap=plt.cm.RdBu, grid=False, fill_mask=False)

if __name__ == '__main__':
    plot_glm()
Run Code Online (Sandbox Code Playgroud)

使用python click库时,出现此错误(python版本2.7.11,Windows 10,单击版本6.6):

    ctx …
Run Code Online (Sandbox Code Playgroud)

python python-click

5
推荐指数
1
解决办法
4150
查看次数

如何将ctx(Context)传递给CliRunner?

CliRunner列出没有参数在其文档中提供上下文.

以下内容应该是最低工作示例.真正的问题有点不同.可以通过将单击修饰函数移动到其自己的测试覆盖功能中来解决.然后点击功能几乎无用.

import click
from click.testing import CliRunner

class Config():
    def __init__(self):
        self.value = 651

@click.command()
@click.pass_context
def print_numberinfo(ctx):
    if not hasattr(ctx.obj, 'value'):
        ctx.obj = Config()
    click.echo(ctx.obj.value)

def test_print_numberinfo():
    ctx = click.Context(print_numberinfo, obj = Config())
    ctx.obj.value = 777
    runner = CliRunner()
    # how do I pass ctx to runner.invoke?
    result = runner.invoke(print_numberinfo)
    assert result.output == str(ctx.obj.value) + '\n'
Run Code Online (Sandbox Code Playgroud)

python python-click

5
推荐指数
1
解决办法
1590
查看次数

python单击帮助格式化换行符

我看到我的EPILOG中没有保留换行符吗?我想知道为什么只在一行包含74字符时才看到换行符吗?

# http://click.pocoo.org/5/commands/

import click, sys

def main_caller(*args, **kwargs):
    print('act on arguments', args, kwargs)

EPILOG = '''
# oneline
# twoline

\n
# oneline with 74char                                                   x
# twoline with 74char                                                   x
'''

@click.group(help='wwwwwwwwww', epilog=EPILOG, invoke_without_command=True, chain=True)
@click.argument('start_or_stop')
@click.option('-v', '--verbose', default=False, help='Print Verbose messages')
@click.option('-l', '--logfile', help='Path to logfile to store log messages')
@click.option('-a', '--action', multiple=True, type=click.Choice(['act1', 'act2', 'act3']), default=['act1', 'act2'])
def cli(*args, **kwargs):
    '''foo bar'''
    pass

@cli.command()
@click.option('--debug/--no-debug', default=False)
def cmd1(*args, **kwargs):
    print('cmd1', args, kwargs)
    return 'cmd11111' …
Run Code Online (Sandbox Code Playgroud)

python python-click

5
推荐指数
2
解决办法
1535
查看次数

将params发送到click.group()的子命令

如果我click.group()有多个子命令,有没有办法可以将命令行参数传递给组内的子命令?

我知道你可以从组中向下通过context,我知道我可以使用callback在命令之前执行的函数,但我不知道是否有更好的方法来执行此操作而不是使用callback.

一个例子:

@click.group()
def cli():
    pass

@cli.command()
@click.argument('task')
@click.argument('task_id')
def sync(task, task_id):
    click.echo('Synching: {}'.format(task))
Run Code Online (Sandbox Code Playgroud)

在这个例子中,有没有办法获得tasktask_id在组方法?

python python-click

5
推荐指数
1
解决办法
1280
查看次数

有没有办法用Python Click自动处理异常?

点击的异常处理的文件中提到,某些类型的例外,如中Abort,EOFErrorKeyboardInterrupt自动由框架正常处理.

对于我正在编写的应用程序,有很多要点可以从中生成异常.终止应用程序是正确的步骤,但不打印堆栈跟踪.我总是可以手动执行此操作:

@cli.command()
def somecommand:
  try:
    # ...
  except Exception as e:
    click.echo(e)
Run Code Online (Sandbox Code Playgroud)

但是,有没有办法让Click自动处理所有异常?

python exception-handling exception python-3.x python-click

5
推荐指数
1
解决办法
1365
查看次数

在单击中弃用参数别名的正确方法

我想弃用参数别名click(例如,从下划线切换为破折号)。有一阵子,我希望两个公式都有效,但是FutureWarning在使用待弃用的别名调用参数时抛出一个。但是,我还没有找到访问调用参数的实际别名的方法。

简而言之,我要:

click.command()
click.option('--old', '--new')
def cli(*args, **kwargs):
    ...
Run Code Online (Sandbox Code Playgroud)

用选项调用时发出警告--old,而用调用时不发出警告--new。有没有一种干净的方式来做到这一点,而又不过度依赖未记录的行为?

我尝试将回调添加到中click.option,但在解析该选项后似乎会调用该回调,并且参数不包含实际使用哪个别名的信息。一个解决方案可能会过载click.Option,甚至可能是click.Command,但是我不知道实际的解析发生在哪里。

python python-click

5
推荐指数
1
解决办法
327
查看次数

Python Click - 如果父命令成功执行,则执行子命令

我正在使用Click来构建一个Python CLI,并遇到了一个问题,即如何在Click中处理异常.

我不确定这里的措辞("子命令","父命令"),但从我的例子中你会得到我希望的想法.我们假设这段代码:

@click.group()
@click.option("--something")
def mycli(something):
    try:
        #do something with "something" and set ctx
        ctx.obj = {}
        ctx.obj["somevar"] = some_result
    except:
        print("Something went wrong")
        raise

    #only if everything went fine call mycommand

@click.group()
@click.pass_context
def mygroup(ctx):
    pass

@mygroup.command(name="mycommand")
@click.pass_context
def mycommand(ctx):
    #this only works if somevar is set in ctx so don't call this if setting went wrong in mycli
Run Code Online (Sandbox Code Playgroud)

当应用程序启动时,这称为:

if __name__ == "__main__":
    mycli.add_command(mygroup)
    mycli()
Run Code Online (Sandbox Code Playgroud)

然后我开始这样的程序:

python myapp --something somevalue mycommand
Run Code Online (Sandbox Code Playgroud)

预期的行为:首先mycli调用它,然后执行其中的代码.如果抛出异常它被except块捕获,则会打印一条消息并引发异常.因为我们没有其他try/except块,所以会导致脚本终止.mycommand …

python python-click

5
推荐指数
1
解决办法
351
查看次数