使用argh设置缩写的简便方法

时间:2012-03-08 14:27:54

标签: python command-line-arguments argparse optparse argh

我正在使用argh库来创建一个python命令行工具。我使用的几个名字已经证明很长,例如:

./my_program.py download-and-parse-data --randomize-order --training-percent 80

是否有一种简单的方法允许缩写?例如,这是上述行的潜在缩写版本。

./my_program.py dpd -r -t 80

理想情况下,我希望能够使用两种命令行形式 - 冗长,信息丰富的版本,以及简短易用的版本。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

虽然接受了argparse答案,但最初的问题是如何使用更简单的argh模块完成此操作。方法如下:

from argh import *
from show import show # only needed for demonstration purposes

CMD_ALIASES = { 'dpd' : 'download-and-parse-data',
                'dp'  : 'download-and-parse-data',
                'dd'  : 'download-data',
                'pd'  : 'parse-data', }

def choices_for(d):
    """
    Return list of unique items (command aliases plus unabridged commands).
    Works in Python >= 2.5. NB In the degenerate case when an alias and an
    unabridged command are identical, the alias takes priority. (In my best
    Terminator voice: Don't do dat.)
    """
    return sorted(set(d.keys()) | set(d.values()))

@arg('cmd', choices=choices_for(CMD_ALIASES))
@arg('-r', '--randomize-order', default=False)
@arg('-t', '--training-percent', default=0)
def main(args):
    args.command = CMD_ALIASES.get(args.cmd, args.cmd)
    show(args, props=True)

dispatch_command(main)

这设置了一个稍微通用的别名机制(允许任何给定命令的多个别名)。生成的args对象具有实际给定命令的args.cmd值和解析给定别名的规范args.command值(如果有)。

例如:

$ ./my_program.py dpd -r -t 80
args:
    cmd='dpd'
    command='download-and-parse-data'
    randomize_order=True
    training_percent=80

如果要将命令分派给各个函数,还有argh内置的另一种机制来执行命令别名:@aliases装饰器,描述为here。注意,这种方法依赖于argparse的最新版本,因此可能无法在较旧的Python发行版/环境中使用。

答案 1 :(得分:0)

您可以使用argparse的{​​{1}}方法轻松完成此操作。请参阅文档here

在你的情况下它可能会分解为:

add_subparsers()

修改

在每个parser = argparse.ArgumentParser() subs = parser.add_subparsers() dpd = subs.add_parser('download-and-parse-data', aliases=['dpd']) dpd.add_argument(...) ... 调用中,您还可以使用多个参数名称。请参阅文档here。例如:

add_argument()