2

我想用 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)

但是,这不起作用,而是我得到:

TypeError: parseCommandlineArguments() takes exactly 2 arguments (1 given)

显然,传递self给装饰函数不是正确的方法。如果我self从方法参数中删除,那么我可以这样做print(myoption),它将打印在屏幕上,但我的类5的任何实例都不会知道该值。Configuration()

处理这个问题的正确方法是什么?我认为它与Click 中的上下文处理有关,但我无法根据提供的示例使其正常工作。

4

1 回答 1

9

如果我对您的理解正确,您需要一个命令行工具,该工具将采用配置选项,然后对这些选项进行一些操作。如果这是您的目标,请查看我发布的示例。此示例使用命令组并通过每个命令传递上下文对象。Click 有很棒的文档,一定要阅读它。

import click
import json


class Configuration(object):
    """
    Having a custom context class is usually not needed.
    See the complex application documentation:
        http://click.pocoo.org/5/complex/
    """
    my_option = None
    number = None
    is_awesome = False
    uber_var = 900

    def make_conf(self):
        self.uber_var = self.my_option * self.number

pass_context = click.make_pass_decorator(Configuration, ensure=True)


@click.group(chain=True)
@click.option('-m', '--myoption', type=click.INT, default=5)
@click.option('-n', '--number', type=click.INT, default=0)
@click.option('-a', '--is-awesome', is_flag=True)
@pass_context
def cli(ctx, myoption, number, is_awesome):
    """
    this is where I will save the configuration
    and do whatever processing that is required
    """
    ctx.my_option = myoption
    ctx.number = number
    ctx.is_awesome = is_awesome
    ctx.make_conf()
    pass


@click.command('save')
@click.argument('output', type=click.File('wb'))
@pass_context
def save(ctx, output):
    """save the configuration to a file"""
    json.dump(ctx.__dict__, output, indent=4, sort_keys=True)
    return click.secho('configuration saved', fg='green')


@click.command('show')
@pass_context
def show(ctx):
    """print the configuration to stdout"""
    return click.echo(json.dumps(ctx.__dict__, indent=4, sort_keys=True))

cli.add_command(save)
cli.add_command(show)

安装后,您可以运行如下命令:

mycli -m 30 -n 40 -a show
mycli -m 30 -n 40 -a save foo.json
mycli -m 30 -n 40 -a show save foo.json

这个复杂的示例是开发高度可配置的多链命令行工具的绝佳演示。

于 2015-09-10T23:54:47.143 回答