我知道如何在python解释器中设置python对象的自动完成(在unix上)。
我需要知道如何在用python编写的命令行程序中启用,选项卡/自动完成任意项。
我的具体用例是需要发送电子邮件的命令行python程序。我希望能够在用户输入电子邮件地址的一部分时自动填写电子邮件地址(我在磁盘上有地址)(并可选择按TAB键)。
我不需要它在windows或mac上工作,只需要linux。
答案 0 :(得分:56)
关注cmd documentation,你会没事的
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)
答案 1 :(得分:55)
使用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)
官方module docs不太详细,请参阅readline docs以获取更多信息。
答案 2 :(得分:34)
由于你在问题中说“NOT interpreter”,我猜你不想要涉及python readline等的答案。 ( 编辑 :事后看来,情况显然不是这样。哼哼。我觉得这个信息很有意思,所以我会留在这里。)
我想你可能会追随this。
它是关于向任意命令添加shell级别的完成,扩展bash自己的tab-completion。
简而言之,您将创建一个包含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]
会为您提供变量opts
中的值,即--help
,--verbose
和--version
。出于您的目的,您基本上希望自定义放入opts
。
请查看链接页面上的示例,这一切都非常简单。
答案 3 :(得分:21)
我很惊讶没有人提到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'))
答案 4 :(得分:12)
这是代码的完整版本,由ephemient here提供(谢谢)。
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
答案 5 :(得分:8)
# ~/.pythonrc
import rlcompleter, readline
readline.parse_and_bind('tab:complete')
# ~/.bashrc
export PYTHONSTARTUP=~/.pythonrc
答案 6 :(得分:1)
您可以尝试使用Python Prompt Toolkit(一个用于在Python中构建交互式命令行应用程序的库)。
该库使添加交互式自动完成功能变得容易,允许用户使用 Tab 键在视觉上循环选择可用的选项。该库是跨平台的(Linux,OS X,FreeBSD,OpenBSD,Windows)。示例:
(图片来源:pcgli)
答案 7 :(得分:1)
效果很好。
#!/usr/bin/python3
import readline
readline.parse_and_bind("tab: complete")
def complete(text,state):
volcab = ['dog','cat','rabbit','bird','slug','snail']
results = [x for x in volcab if x.startswith(text)] + [None]
return results[state]
readline.set_completer(complete)
line = input('prompt> ')
答案 8 :(得分:0)
发布的答案很好用,但是我开源了我在工作中编写的自动完成库。我们已经在生产中使用了一段时间,它快速,稳定且易于使用。它甚至具有演示模式,因此您可以快速测试在输入单词时会得到什么。
要安装它,只需运行:pip install fast-autocomplete
这里是一个例子:
>>> from fast_autocomplete import AutoComplete
>>> words = {'book': {}, 'burrito': {}, 'pizza': {}, 'pasta':{}}
>>> autocomplete = AutoComplete(words=words)
>>> autocomplete.search(word='b', max_cost=3, size=3)
[['book'], ['burrito']]
>>> autocomplete.search(word='bu', max_cost=3, size=3)
[['burrito']]
>>> autocomplete.search(word='barrito', max_cost=3, size=3) # mis-spelling
[['burrito']]
结帐:https://github.com/wearefair/fast-autocomplete作为源代码。
以下是其工作原理的说明:http://zepworks.com/posts/you-autocomplete-me/
它处理拼写错误,并可以选择按单词的权重排序。 (假设burrito
比book
更重要,那么您给burrito
赋予更高的“计数”,它将在结果中的book
之前首先显示。
单词是一本字典,每个单词可以有一个上下文。例如“计数”,如何显示单词,单词周围的其他上下文等。在此示例中,单词没有任何上下文。