【问题标题】:An easy way to set up abbreviations with argh使用 argh 设置缩写的简单方法
【发布时间】:2012-03-26 00:38:27
【问题描述】:

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

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

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

./my_program.py dpd -r -t 80

理想情况下,我希望能够使用 both 命令行形式 -- 长的、信息丰富的版本,以及简短的、易于输入的版本。有什么好办法吗?

【问题讨论】:

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


    【解决方案1】:

    虽然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 发行版/环境。

    【讨论】:

      【解决方案2】:

      您可以使用argparseadd_subparsers() 方法轻松完成此操作。请参阅文档here

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

      parser = argparse.ArgumentParser()
      subs = parser.add_subparsers()
      dpd = subs.add_parser('download-and-parse-data', aliases=['dpd'])
      dpd.add_argument(...)
      ...
      

      编辑

      在每个add_argument() 调用中,您还可以使用多个参数名称。请参阅文档here。例如:

      parser.add_argument('-f', '--foo')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-25
        • 1970-01-01
        • 2011-05-25
        • 2019-08-30
        相关资源
        最近更新 更多