为argparse提供自动外壳完成支持的包。
argcompd的Python项目详细描述
目的
argcomp包提供自动参数完成支持 对于所有使用argparse的argumentparser类的python程序 他们的参数处理。它通过提供一个替换品 它透明地提供了一个(隐藏的)完整的参数,可以是 调用以自动完成参数。必须做的一切 连接是通过调用 这与贝壳的争论。
基本原理
<>已经存在一些类似的软件包。 功能。然而,每一个都被认为是不够的。- optcomplete:顾名思义,optcomplete包仅 使用OptParse模块,该模块已弃用,不应 用于新程序。它也与Python3不兼容, 立即取消资格。
- python selfcompletion:此包与argparse一起工作,但也 python 3还没准备好。代码结构不是很好,而且 不灵活,因为缺少对自定义完成函数的支持。
- argcomplete:argcomplete包似乎是python 3 兼容的。但是,为了提供它复制的功能, 粘贴和修改argparse代码以及shlex模块。 这种方法的缺点是需要修复程序的后台端口 给那些包裹。不是说它很难看。上 好的一面是,这个包支持自定义完成器,并且是唯一 可行的选择,但由于代码重复,它被丢弃为 好。
argcomp结合了前面提到的最好的包。它是 完全符合python 3。它与argparse的argumentparser接口 没有重复它的所有代码,也没有窥视任何内部。 最后,它支持自定义完成符以允许上下文 敏感的完成。
用法
要使用argcomp包,用户只需替换 使用提供的argparse'sArgumentParserCompletingArgumentParser类。因为后者完全 与前者兼容,无需额外工作。
--- example.py +++ example.py @@ -1,7 +1,7 @@ #!/usr/bin/python -from argparse import ( - ArgumentParser, +from deso.argcomp import ( + CompletingArgumentParser as ArgumentParser, ) parser = ArgumentParser(description="Process some integers.")
为了从shell访问完成功能, 需要先登记。通常,这种注册是通过 在shell启动时获取一个准备好的完成文件。样品 完成文件(对bash有效)如下所示:
_complete_example(){localcompletions=$("${1}" --_complete "${COMP_CWORD}""${COMP_WORDS[@]}")if[$? -eq 0];then readarray -t COMPREPLY < <(echo -n "${completions}")fi}complete -F _complete_example example.py
在这里,脚本example.py注册为由 新创建的shell函数_complete_example。一旦这个文件 源于一个外壳,可以完成。
完成符
argcomp支持自定义完成符。完成符是一个简单的函数 与要提供的参数一起注册的 完成。这样的函数需要有一个给定的接口并产生 它的完成。除此之外,几乎没有任何限制 一个完成者能用什么来提供完成。
为本地文件和目录提供完整性的示例完成程序 可以这样:
deflocalFileCompleter(parser,values,word):"""A completer for files in the current working directory."""forvalueinlistdir():ifvalue.startswith(word):yieldvalue
注册很简单,并且与参数规范一起发生:
--- cat.py +++ cat.py @@ -13,7 +13,7 @@ def localFileCompleter(parser, values, word): parser = CompletingArgumentParser(prog="cat") parser.add_argument( - "files", nargs="+", + "files", nargs="+", completer=localFileCompleter, help="Files to cat." )
注意,完成符不是argparse的argumentparser的一部分。作为 因此,切换回它需要删除completer关键字 参数。
安装
argcomp包除了标准python之外没有其他依赖项 3安装。为了安装它,只需使src/ python通过将其嵌入PYTHONPATH而知道的目录。
如果使用Gentoo Linux,则 ebuild可用 可直接使用。
支架
该模块用python 3进行了测试。没有工作要确保 兼容Python2的可用性。