python选项卡完成Mac OSX 10.7(Lion)

python选项卡完成Mac OSX 10.7(Lion),python,readline,osx-lion,Python,Readline,Osx Lion,在升级到lion之前,我已经通过终端在python外壳中完成了tab的工作。接下来,就有可能让tab完成工作 自从升级到Lion之后,我现在无法在Python的终端会话中完成tab。我完全按照上面的说明做了,但还是不起作用 Lion中的readline模块有什么不同吗?连接到“tab:complete”选项似乎不再有效。我想知道是终端忽略了readline,还是python本身 Python版本:2.7.1 编辑: 通过tab complete,我的意思是我可以执行以下操作: # django

在升级到lion之前,我已经通过终端在python外壳中完成了tab的工作。接下来,就有可能让tab完成工作

自从升级到Lion之后,我现在无法在Python的终端会话中完成tab。我完全按照上面的说明做了,但还是不起作用

Lion中的readline模块有什么不同吗?连接到“tab:complete”选项似乎不再有效。我想知道是终端忽略了readline,还是python本身

Python版本:2.7.1

编辑:

通过tab complete,我的意思是我可以执行以下操作:

# django
import MyModel
MyModel.objects.a[TAB] # will complete to all()

苹果没有将GNU
readline
与OS X一起提供。它提供了一个包含
readline
兼容性接口的GNU。苹果提供的系统python和python.org安装程序提供的64位/32位python都是用
libedit
构建的。问题在于
libedit
所支持的命令与
readline
所支持的命令完全不同(例如,请参见讨论)。传统的32位python.org安装程序使用GNU
readline
,其他一些pythonforosx的第三方发行商也使用GNU
readline,比如MacPorts。很可能您以前使用过这样的Python,而不是最近使用的Apple Python。除了修改Django之外,您还有一些选择:您可以安装第三方替换模块;或者您可以使用GNU readline附带的另一个Python。但是,您不应该在10.7上使用python.org仅32位的python,因为不幸的是,10.7上的xcode4不再包括
gcc-4.0
和那些python构建和安装带有C扩展模块的软件包所需的osx10.4usdk

在python启动文件中添加以下内容将为libedit接口和典型的readline模块启用制表符完成。有关python启动文件的详细信息


由于它使用libedit/editline,所以启用自动完成的语法有点不同。 您可以首先通过键入以下命令强制执行emacs绑定(如果我没有错的话,与readline一样):

readline.parse_和_bind(“bind-e”)

然后,您可以添加链接到选项卡按钮(man editrc)的自动完成:

readline.parse_和_bind(“bind'\t'rl_complete”)

如果您想支持缩进并有历史记录(在internet上找到),它应该是这样的(除非我犯了错误):


你以前做过什么?你考虑过使用ipython或bpython之类的东西吗?如果它仍然不起作用,请参见。我曾经在osx 10.6中使用python 2.7,所以它不是系统python。我相信你说的是对的。我不得不使用系统python,因为我正在为django使用一些oracle库。我添加了解决方案,以使选项卡完成工作到您的答案,而不是创建一个新的答案,因为答案中的信息要好得多。如果您愿意,请随意删除它,我将创建一个新的答案。干杯
import readline
import rlcompleter
if 'libedit' in readline.__doc__:
    readline.parse_and_bind("bind ^I rl_complete")
else:
    readline.parse_and_bind("tab: complete")
import readline,rlcompleter

### Indenting
class TabCompleter(rlcompleter.Completer):
    """Completer that supports indenting"""
    def complete(self, text, state):
        if not text:
            return ('    ', None)[state]
        else:
            return rlcompleter.Completer.complete(self, text, state)

readline.set_completer(TabCompleter().complete)

### Add autocompletion
if 'libedit' in readline.__doc__:
    readline.parse_and_bind("bind -e")
    readline.parse_and_bind("bind '\t' rl_complete")
else:
    readline.parse_and_bind("tab: complete")

### Add history
import os
histfile = os.path.join(os.environ["HOME"], ".pyhist")
try:
    readline.read_history_file(histfile)
except IOError:
    pass
import atexit
atexit.register(readline.write_history_file, histfile)
del histfile