如何使python,命令行程序自动完成任意东西而不是解释器

我知道如何设置python解释器(在UNIX上)python对象的自动完成。

  • 谷歌显示了很多关于如何做到这一点的解释。
  • 不幸的是,有这么多的参考文献,很难find我需要做的,这是略有不同的。

我需要知道如何启用,在用python编写的命令行程序中的任意项目的选项卡/自动完成。

我的具体用例是一个需要发送电子邮件的命令行python程序。 我希望能够自动完成电子邮件地址(我有磁盘上的地址),当用户键入它的一部分(和可选地按下TAB键)。

我不需要它在Windows或Mac上工作,只是Linux。

使用Python的readline绑定。 例如,

 import readline def completer(text, state): options = [i for i in commands if i.startswith(text)] if state < len(options): return options[state] else: return None readline.parse_and_bind("tab: complete") readline.set_completer(completer) 

官方模块文档没有更多的详细信息,请参阅readline文档了解更多信息。

按照cmd文档 ,你会没事的

 import cmd addresses = [ 'here@blubb.com', 'foo@bar.com', 'whatever@wherever.org', ] class MyCmd(cmd.Cmd): def do_send(self, line): pass def complete_send(self, text, line, start_index, end_index): if text: return [ address for address in addresses if address.startswith(text) ] else: return addresses if __name__ == '__main__': my_cmd = MyCmd() my_cmd.cmdloop() 

输出为选项卡 – >选项卡 – >发送 – >选项卡 – >选项卡 – > f – >选项卡

 (Cmd) help send (Cmd) send foo@bar.com here@blubb.com whatever@wherever.org (Cmd) send foo@bar.com (Cmd) 

既然你在你的问题中说“不解释”,我猜你不希望Python的readline等类似的答案。 (后来编辑 :显然不是这样,哼哼,我觉得这个信息很有意思,所以我把它留在这里)。

我想你可能会在这之后。

这是关于向任意命令添加shell级完成,扩展bash自己的tab-completion。

简而言之,您将创build一个包含shell函数的文件,该文件将生成可能的完成项,并将其保存到/etc/bash_completion.d/ ,并使用complete的命令进行注册。 以下是链接页面的一个片段:

 _foo() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" opts="--help --verbose --version" if [[ ${cur} == -* ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 fi } complete -F _foo foo 

在这种情况下,键入foo --[TAB]会给出variablesopts的值,即--help ,– --verbose--version 。 出于您的目的,您基本上需要自定义放入opts的值。

看看链接页面上的例子,这一切都非常简单。

我很惊讶,没有人提到argcomplete,这里是一个例子从文档:

 from argcomplete.completers import ChoicesCompleter parser.add_argument("--protocol", choices=('http', 'https', 'ssh', 'rsync', 'wss')) parser.add_argument("--proto").completer=ChoicesCompleter(('http', 'https', 'ssh', 'rsync', 'wss')) 

这里是ephemient 在这里提供的代码的完整版本(谢谢)。

 import readline addrs = ['angela@domain.com', 'michael@domain.com', 'david@test.com'] def completer(text, state): options = [x for x in addrs if x.startswith(text)] try: return options[state] except IndexError: return None readline.set_completer(completer) readline.parse_and_bind("tab: complete") while 1: a = raw_input("> ") print "You entered", a 
 # ~/.pythonrc import rlcompleter, readline readline.parse_and_bind('tab:complete') # ~/.bashrc export PYTHONSTARTUP=~/.pythonrc