pip安装feature_selector时出现setup.py egg_info运行失败(exit code:1)
报错根因
- PyPI上发布的
feature_selector==1.0.0包最后一次更新是2018年,打包时硬编码锁定了一批同年代的老旧依赖版本:seaborn==0.8.1、pandas==0.23.1、scikit-learn==0.19.1、matplotlib==2.1.2,这些版本完全不兼容Python 3.8及以上运行环境。 - 日志里的核心异常
AttributeError: module 'platform' has no attribute 'linux_distribution',是因为platform.linux_distribution()方法在Python 3.8版本就被官方移除,而2.1.2版本matplotlib的安装脚本仍在调用这个废弃接口,直接触发安装流程中断。 - 日志中提示的缺少freetype头文件、libpng的pkg-config信息,是因为老旧版matplotlib没有适配Python3.8的预编译wheel包,pip会回退到源码编译模式,就算补全所有系统编译依赖,最终还是会因为Python版本接口不兼容安装失败。
解决方法
方法一:手动安装放开依赖限制的源码版本(推荐)
不要直接安装PyPI上的旧包,直接获取项目源码手动安装:
- 下载项目源码到本地并解压
- 打开解压目录下的
setup.py文件,删除所有依赖项后面写死的版本号限制,只保留包名即可 - 进入解压目录,执行
pip install .完成安装。这个工具本身逻辑非常简单,对新版本pandas、scikit-learn、matplotlib兼容性没有问题,只是当年打包时错误写死了老版本依赖号。
方法二:创建Python3.7虚拟环境隔离安装
如果不想修改源码,可以单独创建兼容的低版本Python环境安装,避免影响现有项目依赖:
# 用conda创建虚拟环境 conda create -n feature_sel python=3.7 -y conda activate feature_sel # 安装源码编译需要的系统依赖 sudo apt update && sudo apt install -y pkg-config libfreetype6-dev libpng-dev # 执行安装 pip install feature_selector
不要在这个环境里安装其他需要高版本数据科学栈的包,避免依赖冲突。
方法三:直接复用核心代码
feature_selector总代码量不到1000行,核心功能就是围绕缺失率、单一值占比、特征共线性、模型特征重要性几个维度做特征筛选,完全可以把核心实现类直接复制到自身项目中调用,省去折腾依赖的成本,还可以按需调整筛选逻辑。
避坑提醒:不要在当前Python3.8+的主环境里强行降级依赖适配这个包,会把现有环境里的pandas、scikit-learn、matplotlib等核心库全部替换成6年前的旧版本,直接导致其他项目无法运行。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

