CentOS7下Python3.6.4虚拟环境导入bz2报PyInit_bz2相关ImportError求解决
解决CentOS7 Python3.6.4虚拟环境导入bz2模块报错的问题
我之前在CentOS 7的Python 3.6.4虚拟环境里也碰到过一模一样的ImportError: dynamic module does not define module export function (PyInit_bz2)错误,折腾了一阵终于找到几个可行的解决办法,分享给你:
问题原因
这个错误本质是Python编译过程中缺少bz2的系统依赖,导致标准库中的bz2模块没有被正确编译生成;或者虚拟环境没有正确关联到已编译好的bz2模块文件。
解决方案
方案1:安装系统依赖后重新编译Python 3.6.4
这是最彻底的解决方式,因为编译时缺失的依赖必须补全才能让bz2模块正常工作:
- 先安装bz2的开发依赖包:
sudo yum install bzip2-devel - 找到你当初编译Python 3.6.4的源码目录,重新执行编译安装(替换成你自己的安装路径):
cd /path/to/python3.6.4-source ./configure --prefix=/usr/local/python36 # 这里替换为你的Python安装路径 make sudo make install - 编译完成后,重新创建虚拟环境,或者激活现有环境测试
import bz2是否正常。
方案2:手动复制bz2模块文件到虚拟环境
如果不想重新编译Python,可以尝试从已正常工作的Python环境中复制bz2的动态库文件到虚拟环境:
- 先找到系统中已编译好的bz2模块文件(替换为你的Python安装路径):
通常会得到类似find /usr/local/python36 -name "bz2.*"/usr/local/python36/lib/python3.6/lib-dynload/bz2.cpython-36m-x86_64-linux-gnu.so的路径 - 将这个文件复制到虚拟环境的
site-packages目录下(替换为你的虚拟环境路径):cp /usr/local/python36/lib/python3.6/lib-dynload/bz2.cpython-36m-x86_64-linux-gnu.so /path/to/your/venv/lib/python3.6/site-packages/ - 复制完成后激活虚拟环境,再次尝试
import bz2。
方案3:重建干净的虚拟环境
有时候虚拟环境创建时的参数或缓存会导致模块加载异常,试试创建一个全新的虚拟环境:
- 先退出当前虚拟环境:
deactivate - 删除旧的虚拟环境(谨慎操作,确保环境内没有重要文件):
rm -rf /path/to/your/old-venv - 使用Python3.6创建全新的虚拟环境:
python3.6 -m venv /path/to/new-venv source /path/to/new-venv/bin/activate - 激活后直接测试
import bz2。
额外提示
CentOS 7默认的软件包版本偏旧,编译Python前一定要提前安装好常用的开发依赖,比如bzip2-devel、openssl-devel、readline-devel等,避免后续出现其他标准库模块缺失的问题。
内容的提问来源于stack exchange,提问作者daiyue
相关产品推荐
相关产品推荐

