Linux上的Python cmd不会自动完成特殊字符或符号

诸如 – 等的字符不会被Python的基于readline的cmd模块解析为与字母数字ASCII字符相同的方式.这似乎只是Linux特定的问题,因为它似乎在Mac OS上按预期工作.

示例代码

import cmd

class Test(cmd.Cmd):
    def do_abc(self, line):
        print line 
    def complete_abc(self, text, line, begidx, endidx):
        return [i for i in ['-xxx', '-yyy', '-zzz'] if i.startswith(text)]

try:
    import readline
except ImportError:
    print "Module readline not available."
else:
    import rlcompleter
    if 'libedit' in readline.__doc__:
        readline.parse_and_bind("bind ^I rl_complete")
    else:
        readline.parse_and_bind("tab: complete")

Test().cmdloop()

Mac OS上的预期行为

(Cmd) abc <TAB>
abc  
(Cmd) abc -<TAB>
-xxx  -yyy  -zzz  
(Cmd) abc -x<TAB>
(Cmd) abc -xxx

Linux上的行为不正确

(Cmd) abc <TAB>
abc  
(Cmd) abc -x<TAB>
 <Nothing>
(Cmd) abc -<TAB> 
(Cmd) abc --<TAB>
(Cmd) abc ---<TAB>
(Cmd) abc ----

我尝试添加 – 到cmd.Cmd.identchars,但它没有帮助.

cmd.Cmd.identchars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-'

为什么Mac OS和Linux之间的readline解析存在差异,即使它们都使用GNU readline:

苹果系统:

>>> readline.__doc__
'Importing this module enables command line editing using GNU readline.'

Linux的:

>>> readline.__doc__
'Importing this module enables command line editing using GNU readline.'

谢谢!

解决方法:

在linux上,readline模块考虑 – 选项卡完成的分隔符.也就是说,在遇到 – 后,将尝试新的完成.

解决问题的方法是从readline用作分隔符的字符集中删除.

例如.

old_delims = readline.get_completer_delims()
readline.set_completer_delims(old_delims.replace('-', ''))
上一篇:java中从末行逐行向上读取文件


下一篇:RabbitMQ-从基础到实战(6)— 与Spring集成