ipython 报错 readline

26 投票
4 回答
10525 浏览
提问于 2025-04-17 02:00

我在我的Mac上安装了ipython并运行时,收到了以下警告:

 /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
 site-packages/IPython/utils/rlineimpl.py:96:
 RuntimeWarning: Leopard libedit detected - readline will not be wel
 behaved including some crashes on tab completion, and incorrect
 history navigation. It is highly recommended that you install
 readline, which is easy_installable with: 'easy_install readline'

我已经安装了readline,并且不使用最开始安装在 /Library/Frameworks/Python.framework/Versions/2.7/bin/python$ 的系统自带Python。下面显示的 /usr/bin/python 指向的是2.7版本:

uname -a
Darwin macbook.local 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 
16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386

$sudo pip install readline ipython

$ipython --version
0.11

$/usr/bin/python --version # 
Python 2.7.1 

$which python
/Library/Frameworks/Python.framework/Versions/2.7/bin/python

我看过一个问题,链接在这里:Python sys.path modification not working - 我把 /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/readline-6.2.1-py2.7.egg-info 加入到了 /Library/Frameworks/Python.framework/Versions/2.7/bin/ipython 中,现在看起来是这样的:http://pastebin.com/raw.php?i=dVnxufbS

但是我还是搞不明白为什么会出现以下错误:

File
"/Library/Frameworks/Python.framework/Versions/2.7/bin/ipython",
line 9
sys.path.insert(0,"/Library/Frameworks/Python.framework/Versions/2.7/lib/
python2.7/site-packages/readline-6.2.1-py2.7.egg-info")

我觉得上面的路径应该没问题,我的目标是让ipython正常工作,不要再抱怨readline,尽管它已经安装并且可以正常导入。

4 个回答

0

给未来阅读这个回答的朋友们补充一点说明。

在我的情况下——我是在使用MacPorts安装的IPython——在/opt/local/bin/目录下有好几个版本的easy_install,但是没有一个指向最新版本的快捷方式。执行easy_install-2.7 -a readline这个命令就成功了。

1

如果你不介意调整一下你的PYTHONPATH,这里有个方法可以帮你去掉那个烦人的警告:

# move site-packages to the front of your sys.path
import sys
for i in range(len(sys.path)):
    if sys.path[i].endswith('site-packages'):
        path = sys.path.pop(i)
        sys.path.insert(0, path)
        break

如果你在用Django,可以把这个放到你的网站包里的ipython方法,路径是site-packages/django/core/management/commands/shell.py,这样当你运行./manage.py shell的时候,它就会执行。

41

当你用pip安装readline时,它其实是不会被导入的,因为readline.so这个文件会放在site-packages文件夹里,而这个文件夹的位置在libedit系统文件的后面,后者在lib-dynload里(OSX的Python路径顺序很奇怪)。使用easy_install -a readline命令可以安装到可用的readline。

所以你可以选择用easy_install,或者用pip但要调整你的PYTHONPATH/sys.path(这基本上就是说:不要用pip)。

关于这个问题还有更多细节在IPython的邮件列表上(不过这个问题其实和IPython没有什么特别的关系):http://mail.scipy.org/pipermail/ipython-user/2011-September/008426.html

编辑:关于virtualenv的额外说明。

在virtualenv版本低于1.8.3时,有一个bug会导致在创建环境时readline没有正确安装。

撰写回答