Python 2.7环境下旧脚本依赖包冲突问题求助
解决Python 2.7旧脚本依赖冲突的实操方向
首先得说,Python 2.7已经停止维护多年,旧包之间的兼容性确实是个老大难,但针对你的场景,我们可以从几个角度来逐个击破:
1. 用conda环境文件固化依赖,让conda自动解决冲突
手动逐个安装很容易踩版本冲突的坑,最好把所有需要的包、对应Python 2.7兼容的精确版本,以及合适的channel都写在environment.yml里,让conda一次性处理依赖。
比如针对你的需求,我整理了一个适配的yml模板:
name: py27-legacy-script channels: - conda-forge # 优先用conda-forge,旧版本包更全 - defaults dependencies: - python=2.7.18 # Python 2.7的最终稳定版 - pip=20.3.4 # 支持Python 2.7的最后一个pip版本 # 先装geopandas的底层依赖,指定兼容Python2的版本 - gdal=2.4.4 - shapely=1.6.4 - fiona=1.8.13 - pyproj=1.9.6 - rasterio=1.1.5 - rtree=0.9.4 # 其他conda可安装的依赖 - pandas=0.24.2 # pandas 1.0+不再支持Python2 - sqlalchemy=1.3.24 # sqlalchemy 1.4+放弃Python2 - pyyaml=5.4.1 - scikit-image=0.16.2 - beautifultable=0.7.0 - tqdm=4.64.1 # pip安装的包(conda没有合适版本的) - pip: - psycopg2-binary==2.7.7 # 2.8+不支持Python2 - osmnx==0.9 # 你指定的版本
然后执行命令创建环境:
conda env create -f environment.yml
如果conda还是报错,可以尝试加上--override-channels参数强制使用指定的channel。
2. 针对性解决six包的冲突问题
你提到安装geopandas时遇到six版本冲突,这是因为Python 2和3对six的版本要求有差异,解决方法很直接:
- 在安装命令里直接锁定six的兼容版本:
conda install -c conda-forge geopandas=0.7.0 python=2.7 six=1.16.0
- 或者把
six=1.16.0添加到上面的environment.yml的dependencies里,让conda自动协调。
3. 分平台处理特殊依赖
Linux环境
Linux下geopandas的依赖相对好处理,优先通过conda-forge安装底层库(GDAL、Shapely等),再装geopandas:
conda install -c conda-forge gdal=2.4.4 shapely=1.6.4 fiona=1.8.13 python=2.7 conda install -c conda-forge geopandas=0.7.0
Windows环境
Windows下要严格按照你提到的指定版本安装,先逐个装底层依赖,再装上层包:
conda install -c conda-forge pyproj=1.9.6 gdal=2.4.4 shapely=1.6.4 fiona=1.8.13 rasterio=1.1.5 rtree=0.9.4 python=2.7 conda install -c conda-forge geopandas=0.7.0 pip install osmnx==0.9 psycopg2-binary==2.7.7
4. 避免conda和pip混用的坑
如果必须混用conda和pip,一定要遵循这个顺序:
- 先用conda安装所有能通过conda安装的包
- 升级pip到支持Python2的最高版本(20.3.4)
- 再用pip安装conda无法提供的包
这样能最大程度减少版本冲突的概率。
最后提个建议
虽然以上方法能暂时解决问题,但Python 2.7已经完全没有安全更新了,长期来看最好还是把脚本迁移到Python 3,比如用2to3工具做初步转换,再手动调整geopandas、osmnx等包的新版本适配问题。
内容的提问来源于stack exchange,提问作者Hugh_Kelley




