Category Archives: 解决问题

修复Ipython启动报错的问题

修复 Ipython启动报告 ImportError: No module named shutil_get_terminal_size 错误的问题

背景:

  • 系统版本:Debian 9(Debian 8上面也碰到并解决了)
  • Ipython版本: 5.1.0-3(安装自Debian仓库)
  • Python版本:2.7.13

报错

启动Ipython时,报以下错误

> ipython
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/IPython/__init__.py", line 48, in <module>
    from .core.application import Application
  File "/usr/lib/python2.7/dist-packages/IPython/core/application.py", line 25, in <module>
    from IPython.core import release, crashhandler
  File "/usr/lib/python2.7/dist-packages/IPython/core/crashhandler.py", line 28, in <module>
    from IPython.core import ultratb
  File "/usr/lib/python2.7/dist-packages/IPython/core/ultratb.py", line 128, in <module>
    from IPython.utils.terminal import get_terminal_size
  File "/usr/lib/python2.7/dist-packages/IPython/utils/terminal.py", line 22, in <module>
    from backports.shutil_get_terminal_size import get_terminal_size as _get_terminal_size
ImportError: No module named shutil_get_terminal_size

别人的解决方法:

我的另类的解决方法:

其实以前我基本上是通过修改terminal.py的代码来解决问题的,不过后面不知道什么原因修改后也不行,所以我自己又想了一个差不多的方法来绕开这个问题。不过现在想想,这个方法还是非常粗暴的。

Ipython启动报这个错误的原因是因为它找不到某个包了(backports.shutil_get_terminal_size),但是通过查看目录/usr/lib/python2.7/dist-packages/,发现下面有是有backports这个package的文件夹的,然后里面有shutil_get_terminal_size这个package的文件夹,不知道为什么就发生了import错误,但是我将这个包修改个名字,然后在terminal.py下对应修改下就又可以正常引入了。

先复制一份shutil_get_terminal_size文件夹到/usr/lib/python2.7/dist-packages/下,把名字改成自己定义的一个名字,不要和别的包冲突就可以了

sudo cp backports/shutil_get_terminal_size alex_fix_shutil_get_terminal_size -rf

这里我改成了alex_fix_shutil_get_terminal_size,这个就是我们新创建的package

然后就修改/usr/lib/python2.7/dist-packages/IPython/utils/terminal.py

# use backport on Python 2
#from backports.shutil_get_terminal_size import get_terminal_size as _get_terminal_size
from alex_fix_shutil_get_terminal_size import get_terminal_size as _get_terminal_size

从自己新创建的package中引入需要的代码,这样就能够正常启动ipython了。

现在看来,这个解决方法不是很好,它如果在别的地方也需要这个package的话,可能就得一并修改才行,不是很漂亮。

另外

在Debian下,安装python包有2个选择,可以走pip,也可以走apt,不过这2个通常是会有冲突的,在安装包时要注意到这个问题。