CentOS 6/7环境下Tox、setuptools与SCL Python版本整合经验问询
整合Tox、setuptools与CentOS SCL Python版本的实操经验
我之前在CentOS 7上折腾过rh-python34、rh-python36和Tox、setuptools的整合,踩了好几个坑,这里把我的实操经验分享出来,应该也能适配CentOS 6的场景。
1. 先搞定SCL环境的基础安装与激活
- 首先得把对应版本的SCL包装上,比如要装rh-python36的话,执行:
yum install rh-python36 rh-python36-python-devel(换版本的话把36改成34/35就行) - 注意SCL的Python是隔离的独立环境,默认不会加到系统全局PATH里,所以每次使用前得手动激活:
scl enable rh-python36 bash。如果不想每次都输,可以把这条命令加到你的~/.bashrc里,但Tox运行时得确保能正确加载这个环境。
2. 配置Tox识别SCL的Python版本
Tox默认只会找系统PATH里的Python,所以得想办法让它识别到SCL里的隔离版本,这里有两种实用方法:
方法一:直接指定Python路径
SCL的Python一般安装在/opt/rh/rh-pythonXx/root/usr/bin/pythonX.X,比如rh-python36的路径就是/opt/rh/rh-python36/root/usr/bin/python3.6。直接在tox.ini里指定每个环境的basepython就行:
[tox] envlist = py34, py35, py36 [testenv] commands = pytest # 这里换成你实际的测试命令 deps = pytest setuptools>=60.0.0 # 按需指定你需要的setuptools版本 [testenv:py34] basepython = /opt/rh/rh-python34/root/usr/bin/python3.4 [testenv:py35] basepython = /opt/rh/rh-python35/root/usr/bin/python3.5 [testenv:py36] basepython = /opt/rh/rh-python36/root/usr/bin/python3.6
方法二:用SCL激活脚本做包装
如果觉得路径写死不够灵活,可以写个简单的shell脚本,比如scl_python36.sh:
#!/bin/bash scl enable rh-python36 "python3 $@"
给脚本加执行权限:chmod +x scl_python36.sh,然后在tox.ini里把basepython指向这个脚本:
[testenv:py36] basepython = ./scl_python36.sh
这个方法适合需要在激活SCL后做额外配置的场景,比如设置环境变量之类的。
3. 升级setuptools到兼容版本
SCL自带的setuptools版本普遍偏老(比如rh-python36自带的可能是39.x版本),而很多新的Python包要求更高版本的setuptools,这里有两种处理方式:
- 推荐:在Tox环境内升级:直接在
tox.ini的[testenv]的deps里加上setuptools>=你的目标版本,这样每个Tox测试环境都会独立安装指定版本的setuptools,不会污染SCL的基础环境。 - 提前升级SCL基础环境:如果想让SCL环境本身的setuptools版本更高,可以激活SCL后执行:
scl enable rh-python36 "pip install --upgrade pip setuptools",这样后续Tox安装依赖会更顺畅。
4. 踩过的坑及解决办法
- 坑1:Tox提示
InterpreterNotFound,找不到SCL的Python
解决:先执行scl enable rh-python36 "which python3"确认路径是否正确,然后检查tox.ini里的basepython路径有没有写错;另外要确保运行Tox的用户有SCL目录的访问权限(一般默认没问题,除非是权限配置特殊的场景)。 - 坑2:安装setuptools时出现
ImportError或版本冲突
解决:在Tox的deps里加上pip>=20.0.0,老版本的pip可能不支持新的setuptools版本;另外尽量避免全局环境和Tox环境混用依赖,让每个Tox环境独立管理自己的依赖包。 - 坑3:CentOS 6上编译Python包失败
解决:CentOS 6的系统库比较老旧,需要先装一些基础编译依赖:yum install gcc glibc-devel zlib-devel,不然像numpy这类需要编译的包会报错。
我用这套流程在CentOS 7上成功跑通了rh-python34、36的Tox测试,CentOS 6的话只要补充好系统依赖,应该也能顺利搞定。如果还有具体场景的问题,可以再细化讨论。
内容的提问来源于stack exchange,提问作者user465374
相关产品推荐
相关产品推荐

