如何阻止pip升级时覆盖cacert.pem文件?(Mac虚拟环境)
我完全懂你遇到的这个痛点——每次pip升级就把你辛辛苦苦加的公司证书覆盖掉,太闹心了!针对Mac上的virtualenv环境,其实有几个更优雅的解决方案,不用再去修改pip自带的证书文件,还能让整个虚拟环境都用自定义证书:
解决方案:给虚拟环境指定全局自定义证书
不用再碰lib/pythonX.X/site-packages/pip/_vendor/certifi/cacert.pem了,这个文件确实会在pip升级时被强制覆盖。推荐下面两种持久化的方法:
1. 给虚拟环境配置专属的pip配置文件(最推荐)
这种方法只作用于当前虚拟环境,而且完全不受pip升级影响:
- 先激活你的虚拟环境:
source /path/to/your/env/bin/activate - 在虚拟环境内创建pip配置目录:
mkdir -p $VIRTUAL_ENV/etc - 创建并写入配置文件:
cat <<EOF > $VIRTUAL_ENV/etc/pip.conf [global] cert=/absolute/path/to/your/custom_cacert.pem EOF - 这里的
custom_cacert.pem建议这么制作:先复制一份pip原来的cacert.pem,再把公司防火墙的证书追加到这个文件末尾,这样既保留了默认的根证书,又加入了公司的认证证书。
之后不管你在这个虚拟环境里怎么升级pip、安装包,都会自动使用你指定的证书文件,彻底避开覆盖问题。
2. 通过环境变量持久化设置
如果你更习惯用环境变量,可以把证书路径加到虚拟环境的激活脚本里:
- 激活虚拟环境后,编辑激活脚本:
nano $VIRTUAL_ENV/bin/activate - 在文件末尾添加一行:
export PIP_CERT=/absolute/path/to/your/custom_cacert.pem - 下次激活这个虚拟环境时,这个环境变量会自动生效,pip会优先读取这个路径的证书。
为什么不推荐修改pip自带的cacert.pem?
因为pip每次升级时,都会从certifi依赖包重新安装这个文件,你手动添加的证书肯定会被完全覆盖,所以上面两种方法才是长期有效的解决方案。
内容的提问来源于stack exchange,提问作者hamdog
相关产品推荐
相关产品推荐

