当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使python,命令行程序自动完成任意事物而不是解释器》经验,为你挑选了6个好方法。

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

谷歌显示了很多关于如何做到这一点的解释.

不幸的是,有很多参考文献很难找到我需要做的事情,这有点不同.

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

我的具体用例是一个需要发送电子邮件的命令行python程序.我希望能够在用户键入部分电子邮件地址(我在磁盘上有地址)时自动填充电子邮件地址(并且可以选择按TAB键).

我不需要它在Windows或Mac上工作,只需要linux.



1> Florian Bösc..:

按照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)



2> ephemient..:

使用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文档以获取更多信息.



3> 小智..:

既然你在问题中说"NOT interpreter",我猜你不想要涉及python readline等的答案.(编辑:事后看来,情况显然不是这样.哼哼.我觉得这个信息很有意思,所以我会留在这里.)

我想你可能会在此之后.

它是关于向任意命令添加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.

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


其实我是因为那个来到这里的

4> qed..:

我很惊讶没有人提到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'))



5> Paul D. Eden..:

下面是我的话非常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



6> user178047..:
# ~/.pythonrc
import rlcompleter, readline
readline.parse_and_bind('tab:complete')

# ~/.bashrc
export PYTHONSTARTUP=~/.pythonrc

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有