一、ModuleNotFoundError : No module named ‘_bz2’

 

 

 

 

 

 

 

一般这是在 linux 下使用官方 source release 安装时会出现这个问题,而 apt-get 之类的则不会。

这是因为源文件安装并没有将路径添加到环境中,也没有生成一些必要的系统文件。有好处也有坏处,好处就是低耦合,删除相关包不会影响到系统整体的稳定;坏处就是会出现某些程序软件要调用的时候找不到这个包。

解决办法:

先安装 bz2 包,从 https://pypi.org/ 搜索相关包名字,根据系统的相关配置和 python 版本下载对应的安装包 或 源文件。

若还是出现这个报错,可能就是少了一个 .so 文件了,大概是 python 中 lib-dynload 文件夹下的 bz2 的 .so 文件。

路径:…/python36/lib/python3.6/lib-dynload/

文件名:_bz2.cpython-36m-x86_64-linux-gnu.so

里面的 -36m 是版本对应的,3.6 版本所以就是 -36m

PS. 实际的机制: bz2 是一个解压功能的 API,是系统自带、 yum 或者 apt-get 安装的系统包,python 中调用的并不是 python 代码编写的解压功能第三方包,而是调用了系统的 bz2,像这种通过调用系统包实现功能的时候要注意是否有 .so 文件了。(maybe, 自我理解)

二、ModuleNotFoundError : No module named ‘_tkinter’

这个问题是个非常麻烦的东西,需要在安装 python 编译的时候就要设置好了。

介绍:

Tkinter 模块(‘TK 接口’)是 Python 的标准 Tk GUI 工具包的接口,可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 系统 和 Macintosh 系统里。

一般用户使用 matplotlib 来进行绘图操作的时候,经常出现这个 no module 问题,一看就知道缺少 tkinter 包,但是在 pypi 官网上并没有搜到相关的安装包,所以不能用 pip 安装

结构:

tkinter 实际上是 Python 调用 tcl 程序的标准 Python 程序,用户用 Python 通过这个 interface 调用系统中的 tcl 程序,而大多数 Unix 系统中都内置了很多的 tcl 程序和命令。

Tcl,Tool Command Language,工具控制语言,其面向对象为 otcl 语言。Tk 是 Tcl “图形工具箱”  的拓展,用于提供各种标准的 GUI 接口项,以利于进行高级应用程序开发。

所以实际就是:… -> Tcl -> Tk -> tkinter -> python

安装方法:

若系统已经有了一个 python3 的环境在 /usr/local/python3.x 了,这时候就重新编译一样的版本的 python ,./configure 设置路径为同一个路径,大胆的覆盖它!(要是真的虚,不敢的话,这种结构安装的python3可以允许你先copy一份backup一下,再大胆覆盖掉!)。

这样 python 中才会有 tkinter 的支持,在 pip 中是看不到有安装相关 tkinter 包的。

若是运行中发现  error while loading shared libraries 问题,看下一节。但这不是安装错的提示,是安装没完全配置完的原因。

注意:

python2 版本可以用系统安装的办法就能解决,这是因为系统内置的 python 版本就是 2,用 yum 和 apt 安装时检测到的是 2 下载的 Tcl 和 Tk 支持的版本也就自然是 2 。但是要使 Python3 版本的也能调用 Tkinter,则需要用源码安装。

三、error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file or directory

实际上遇到的问题是在 上面 Tkinter 安装过程中,Python 重新编译完毕后,调用 pip 安装其他包时,提示没有找到 libtk8.6.so 。怎么可能!!分明在 /usr/local/lib 目录下看到这个 .so 文件了!

很明显,找不到的原因是 python 他找不着了,解决这个问题就是我们让 python 找到 libtk8.6.so。

网上给的一种解决办法就是 personal 用户设置一下 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib 临时添加一下环境,但是这招时灵时不灵,重新连接后还会无效,需要重新再打一遍。

实际上,像 Tcl、Tk 这种较 系统底层 的程序和接口,系统安装完后会生成一个添加到全局环境的文件,一般都是设置在 /etc/ld.so.conf.d/ 目录下,系统是调用 /etc/ld.so.conf 的,里面就一句代码:

很明显,加载 ld.so.conf.d 目录下所有 .conf 后缀文件,像 ffmpeg、opencv 等都是这样将其环境添加到全局中的。如 ffmpeg.conf 文件,里头就只有一句 /usr/local/ffmpeg/lib。

同理,我们应该将 Tcl 和 Tk 的 lib 环境添加到全局,要是系统指令( yum、apt )安装就会帮你创建一个这样的文件,但是自己用源码安装,就不会有这个文件,这时就要手动创建一下。

解决方法,这里要分为两种情况:

第一种 – 编译步骤中,若 ./configure 设置了–prefix:

那么将环境装到指定位置中 /usr/local/tcl,那么添加里头的 lib 就如同上述的 ffmpeg 一样,在 ld.so.conf.d 创建一个 tcl.conf 文件,里面写上 lib 的绝对路径。

第二种 – 编译步骤中,若 ./configure 没有设置自定义路径:

那么系统编译会默认安装到 /usr/local/lib 中。按理说,系统应该会自己调用 /usr/local/lib 的,若没有,检查一下 ld.so.conf 文件或者 ld.so.conf.d 目录的文件,有的系统中并没有设置这个路径,所以不会加载到 /usr/local/lib 这个目录。那么就需要添加该路径,可以在 ld.so.conf 中直接添加,但我想不能破坏 ld.so.conf -> ld.so.conf.d 机制,所以我推荐在 ld.so.conf.d 中创建一个 public.conf 文件,里头写上 /usr/local/lib 这个路径。

最后运行 sudo ldconfig,以更新 /etc/ld.so.cache 文件。

另记:

通常情况下,许多开源代码的程序或者函数库都会默认安装到 /usr/local 目录下的相应位置(如:/usr/local/bin 或 /usr/local/lib )以便于系统自身的程序或函数库相区别。而很多的 Linux 系统的 /etc/ld.so.conf 文件中默认又不包含 /usr/local/lib ,因此会出现安装了共享库(全局),但是却无法找到共享库的情况。

PS. 这个问题关键几个部分

  1. 有没有这个 .so 文件
  2. 有没有加载 .so 文件
  3. 有没有权限(一般不会是这个)

检查、理清相关关系就好解决了。

顺便记录一下设置动态库的运行时搜索加载优先级:

  1. LD_RUN_PATH 设置的路径
  2. 链接器使用-rpath 或 -R 选项设置的路径
  3. LD_LIBRARY_PATH (LD表示动态库)设置的路径 (可在个人 .bashrc 设置加载局部,随便弄,出问题可所属目录全部删掉 )
  4. /etc/ld.so.conf 配置的路径 (开始小心了,系统文件区)
  5. /usr/lib 和 /lib/ (超级小心,核心系统文件目录下)

四、关于pip的报错Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host=’pypi.org’, port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(“Can’t connect to HTTPS URL because the SSL Module is not available.”,)) – skipping的问题

具体描述:

在Ubuntu 16.04系统自带了一个python3的情况下,自行安装了另外一个python3.6.9版本,后更新了pip版本后,使用pip369 list发现该问题出现,并在实际网络安装python第三方包的时候出现多次这个问题。

原因可能是因为某个系统自带的python3是系统安装的,安装时有很多地方自行进行约束,令新安装版本的pip3使用时出现问题;也有可能是国家屏障block掉了网络访问(注意是否通网);也有可能是指令太奇葩(pip369)使的访问pypi.org拉取资源的时候,SSL证书出现问题。

解决方法:

换一个资源拉取的地址,不使用pip默认的pypi.org官方维护的网站下载资源,而是使用国内的python安装包资源。使用方法为

pip369 install xxx -i http://mirrors.aliyun.com/pypi/simple/ –trusted-host mirrors.aliyun.com

其中的地址可以看情况更换:

  1. http://mirrors.aliyun.com/pypi/simple/ 阿里云
  2. https://pypi.mirrors.ustc.edu.cn/simple/ 中国科技大学
  3. https://pypi.tuna.tsinghua.edu.cn/simple/ 清华大学
  4. http://pypi.mirrors.ustc.edu.cn/simple/ 中国科技技术大学