文档章节

bpython ImportError: No module named _curses 的解决办法

大数据之路
 大数据之路
发布于 2013/10/10 01:58
字数 1046
阅读 4238
收藏 0

命令行下的 python 其实是很难用的,最近想尝试下 bpython,它自带语法提示、颜色高亮等 feature,结果 sudo pip install bpython 之后,运行提示 ImportError: No module named _curses

这就尴尬了,curses 库 ( ncurses )提供了控制字符屏幕的独立于终端的方法。curses 是大多数类似于 UNIX 的系统(包括Linux)的标准部分,而且它已经移植到 Windows 和其它系统。

1、针对 windows 的方案:

安装包地址   http://www.lfd.uci.edu/~gohlke/pythonlibs/#curses

安装对应包   pip install name.whl

由于我的是 centos,以上方案并不适用,所以有必要研究下 linux/centos 的解决方案。

2、针对 linux 的方案:

用pip(python2.7 如果configure的时候–with-ensurepip=yes 则会自动帮你安装pip)安装了curses-2048  (sudo pip install curses-2048)  仍然继续提示 

import curses
File “/usr/local/lib/python2.7/curses/__init__.py”, line 15, in <module>
from _curses import *
ImportError: No module named _curses

到底是什么原因呢?明明安装了 curses 呢?

仔细分析,你应该会发现 第一次没有安装 curses 模块和安装后, 其实提示的错误是不完全一样的。  正常没有安装 curses时,会提示找不到模块 curses, 而这一次提示的是 no module named _curses , 而且提示你在 curses/__init__.py 里第几行的错误。实际上已经load了curses,只是再加载的中间出现了错误。

经过对比python2.6 ,终于发现,原来 pythong2.7/lib-dynload 里没有相应的 curses 库

_curses_panel.so
_curses.so

看到名字,你也许就明白了, 原来 _curses 是指这个 _curses.so 无疑了。

解决步骤:

find / -iname "_curses*.so" 2>/dev/null
/usr/lib64/python2.6/lib-dynload/_curses.so
/usr/lib64/python2.6/lib-dynload/_curses_panel.so

find / 2>/dev/null | grep 'python2.7/lib-dynload'|head -2 
/opt/soft/python-2.7.11/lib/python2.7/lib-dynload
/opt/soft/python-2.7.11/lib/python2.7/lib-dynload/math.so

cp /usr/lib64/python2.6/lib-dynload/_curses*.so /usr/local/lib/python2.7/lib-dynload/

find / -iname "_curses*.so" 2>/dev/null
/usr/lib64/python2.6/lib-dynload/_curses_panel.so
/usr/lib64/python2.6/lib-dynload/_curses.so
/usr/local/lib/python2.7/lib-dynload/_curses_panel.so
/usr/local/lib/python2.7/lib-dynload/_curses.so

bpython

也就是你将 python2.6 的 这2个so文件拷贝到 python2.7 的lib-dynload 文件夹下, 就解决了问题。

but,至于为什么pip install curses-2048 没有安装此2个so, 也不清楚,但是问题总算解决了, 具体的原因待更进一步分析。

3、Ubuntu下的一个坑:

在 Ubuntu 下,从自带的 Python 3.5  copy 上述两个文件到自己安装的 python 3.7 的 /usr/local/lib/python3.7/lib-dynload 下,一定要记得改名字里带的版本号:

 mv _curses.cpython-35m-x86_64-linux-gnu.so                _curses.cpython-37m-x86_64-linux-gnu.so
 mv _curses_panel.cpython-35m-x86_64-linux-gnu.so      _curses_panel.cpython-37m-x86_64-linux-gnu.so

否则,bpython 还是会报错找不到该模块。

4、EOF occurred in violation of protocol

我在使用 requests 的时候频繁遇到下面的错误:

EOF occurred in violation of protocol (_ssl.c:600)

这个错误在 Python2 和 Python3,macOS 和 Ubuntu 下都有出现。从报错信息中可以看出该错误与 HTTPS 握手相关。

这个错误在 这个 issue 中讨论得最为充分。

通过分析,我找到了这个问题产生的原因:在安装 requests 库的时候,没有正确安装 security 包。

下面是解决方案(针对 Ubuntu):

1. 安装支持的 dev 包:

sudo apt-get install libffi-dev libssl-dev python-dev

若不安装上面的包,在安装 requests 的相关支持包的时候,可能会出现下面的错误:

distutils.errors.DistutilsError: Setup script exited with error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
----------------------------------------
Failed cleaning build dir for cryptography

2. 安装 requests 及其安全支持包

pip install 'requests[security]'

requests[security] 是一个扩展,它会安装下面三个附加的包用来支持安全连接:

  • pyOpenSSL
  • ndg-httpsclient
  • pyasn1

详见 extras_require 。

5、ImportError: No module named _sqlite3

find / -name _sqlite3.so 2>/dev/null  
/usr/lib64/python2.6/lib-dynload/_sqlite3.so

find / -type d -name "lib-dynload" 2>/dev/null             
/usr/lib64/python2.6/lib-dynload
/opt/soft/python-2.7.11/lib/python2.7/lib-dynload
/opt/soft/python3.6/lib/python3.6/lib-dynload

Refer:

[1] python no module named _curses的问题解决

http://blog.hissummer.com/2015/09/python-no-module-named-_curses%E7%9A%84%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/

[2] How to install curses in pyenv?

https://github.com/pyenv/pyenv/issues/240

[3] EOF occurred in violation of protocol

http://blog.zengrong.net/post/2616.html#

© 著作权归作者所有

共有 人打赏支持
大数据之路
粉丝 1509
博文 516
码字总数 342856
作品 0
武汉
架构师
加载中

评论(1)

大数据之路
大数据之路

引用来自“zhujinhe”的评论

这个按照默认只输出2秒钟后的最后一行而不是2秒钟内的所有变化,而且只能监视一个文件。其中有一个人fork了一个项目,改善了这一情况。https://github.com/wojons/python-tail
bpython-----python增强解释器

bpython 是一个增强的 Python 交互解释器,使用 curses 包开发,提供了实时的语法高亮、代码自动完成、函数参数自动完成等功能。bpython 是一个增强的 Python 交互解释器,使用 curses 包开发...

twins
2012/10/19
0
0
交互式 shell 玩转 Python

Python 编程语言已经成为 IT 中使用的最流行的语言之一。成功的一个原因是它可以用来解决各种问题。从网站开发到数据科学、机器学习到任务自动化,Python 生态系统有丰富的框架和库。本文将介...

不正经程序员
08/02
0
0
使用交互式 shell 来增强你的 Python

Python 编程语言已经成为 IT 中使用的最流行的语言之一。成功的一个原因是它可以用来解决各种问题。从网站开发到数据科学、机器学习到任务自动化,Python 生态系统有丰富的框架和库。本文将介...

10%
05/19
0
0
Python之Django基本命令

一、新建项目 注意 project_name 是自己的项目名称,需要为合法的 Python 包名,如不能为 1a 或 a-b。 二、新建APP 要先进入项目目录下,cd project_name 然后执行下面的命令; 一般一个项目...

baishuchao
07/14
0
0
Flask扩展flask-script文档中文翻译

Flask扩展flask-script文档中文翻译 Flask-Script扩展提供向Flask插入外部脚本的功能。包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,以及其他的运行在...

青崖白鹿
2013/09/03
0
1

没有更多内容

加载失败,请刷新页面

加载更多

Redis应用之分布式锁(set)

Redis应用之分布式锁(set) 在单机应用的场景下,我们常使用的锁主要是synchronized与Lock;但是在分布式横行的大环境下,显然仅仅这两种锁已经无法满足我们的需求; 需求:秒杀场景下,有若干...

GMarshal
20分钟前
0
0
python实现简单的文件加密与解密

对于任意的一个文件,本质上来讲都是二进制的。 对于任意一个二进制数a,对其用另外任意一个与a的位数相同的二进制数m进行“异或”操作得到结果e,即e=a xor m; 如果再讲上面得到的e用m进行...

Aomo
21分钟前
0
0
Android开发应用程序生成以太坊钱包

Android应用程序以太坊钱包生成,要做的工作不少,不过如果我们一步一步来应该也比较清楚: 1.在app/build.gradle中集成以下依赖项: compile ('org.web3j:core-android:2.2.1') web3j核心是...

geek12345
36分钟前
0
0
ArrayList嘿嘿嘿

数组扩容技术: //扩容技术 将原数组objs类容复制到新数组并且长度为11 Object[] newObjs = Arrays.copyOf(objs,11); 数组比较大那么System.arraycopy比较有优势,因为其使用的是内存复制,省...

熊猫你好
59分钟前
2
0
Android平台下的一个好用的日历库(sxtwl_cpp),支持农历转公历,和公历转农历等功能

python版的sxtwl_cpp传送入口 在build.gradle的allprojects中加入 maven { url 'https://dl.bintray.com/yuangu/sxtwl' } 最终如下面代码所示: allprojects { repositories { ......

元谷
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部