错误信息:ModuleNotFoundError: No module named ‘bintrees.cython_trees’
环境:
系统:centos6
python版本:3.6
canda虚拟环境
错误描述:
在mac上调试的时候,pip install bintrees下载后,引用cython_trees是没有问题的。即:
from bintrees import cython_trees
不出错即可
上传到linux系统上之后,继续使用pip 下载bintrees,但是运行代码就出错,错误信息为:
ModuleNotFoundError: No module named 'bintrees.cython_trees'
解决办法
解决办法为:源码安装,流程如下
- 激活虚拟环境:如果有虚拟环境则激活,否则不用激活
- 下载cython模块:pip install Cython
- git clone https://github.com/mozman/bintrees
- 进入到源码文件夹:cd bintrees
- 安装模块: python setup.py install
原因剖析
主要介绍我的思维过程:
-
由于在不同系统上使用相同的命令安装的模块,因此不是命令导致的,查看模块安装路径:
a) 在mac上目录结构如下:
在linux下结构如下(可以使用pip show bintrees查看安装路径):
对比可以发现缺少一个so文件 -
查看so文件是什么:大体上是为了加密所用
-
查看so文件制作过程:主要引用cython模块
-
查看源码的setup.py文件,可以看到如下代码:
from setuptools import Extension
try:
from Cython.Distutils import build_ext
ext_modules = [Extension("bintrees.cython_trees", ["bintrees/ctrees.c", "bintrees/cython_trees.pyx"]),
]
commands = {'build_ext': build_ext}
except ImportError:
ext_modules = []
commands = {}
-
猜测是pip下载的时候,没有安装完全,具体原因未知
-
尝试使用源码安装,可以成功,linux系统下,bintrees包的目录如下
-
激活python,使用
from bintrees import cython_trees
命令不报错