IPython仅能自动补全部分模块

6
我正在使用EPD版本的Python和IPython。在使用easy_install安装了一些模块后,我发现虽然它们可以被导入,但无法通过制表符自动补全。它们存在于路径中,但是,尽管包括的模块(pylab、readline、math)可以被自动补全,但这些新模块不能。
有人知道我应该查找什么问题吗?我已经检查过这些包是否与其他模块在同一个位置:
In [1]: import pylab

In [2]: pylab
Out[2]: <module 'pylab' from '/Library/Frameworks/Python.framework/Versions/5.0.0/lib/python2.5/site-packages/pylab.pyc'>

In [3]: import BeautifulSoup

In [4]: BeautifulSoup
Out[4]: <module 'BeautifulSoup' from '/Library/Frameworks/Python.framework/Versions/5.0.0/lib/python2.5/site-packages/BeautifulSoup-3.1.0.1-py2.5.egg/BeautifulSoup.pyc'>

也许是某些东西没有正确处理 .eggs 文件夹?谢谢。

更新: 继续跟进 gnibbler 的帖子,我发现在 completer.py 的第633行会出现异常:

    try:
        ret = self.matches[state].replace(magic_prefix,magic_escape)
        return ret
    except IndexError:
        return None

但是是什么导致了失败呢... 更新:
In [5]: from Bea<tab_here>
*** COMPLETE: <Bea> (0)
matches: []
state: 0

所以这只是说匹配列表是一个空集合:没有匹配项。它仍然找不到模块。当我有时间时,我会尝试调查matches在哪里获取其寻找的模块。


你的意思是 import Be<tab> 不起作用?还是 BeautifulSoup.<tab> 不起作用? - John La Rooy
前者。手动输入名称并导入后,可以使用制表符自动完成模块成员。 - physicsmichael
我也遇到了同样的问题,在Mac OS X上使用Python 2.6.2和IPython 0.10... - Eric O. Lebigot
IndexError 表示状态不在匹配项中。您可以尝试在异常处理程序中同时打印它们吗? - John La Rooy
3个回答

13
我昨天在stackoverflow上找到了这个问题的答案,因为我已经厌倦了这种行为。
似乎IPython有一个简单的数据库,其中包含它可以在sys.path中找到的所有模块。每次安装新模块时,你都必须编写魔法代码。
In [1]: %rehashx

这样可以使IPython重新生成其数据库。然后你就可以对新模块进行TAB补全。


2

Ipython/completer.py的末尾有以下代码:


        except:
            #from IPython.ultraTB import AutoFormattedTB; # dbg
            #tb=AutoFormattedTB('Verbose');tb() #dbg<br>
            # If completion fails, don't annoy the user.
            return None

也许取消注释会给你一个提示。

没有运气。关于未完成的缺乏,没有任何“详细说明”。 - physicsmichael

0

在本地安装的非egg模块可以在进行import时通过名称自动完成,但是egg模块不能(IPython 0.10,Python 2.6.2,Mac OS X)。

我建议向IPython提交一个功能请求/错误报告!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接