如何解决pip install访问files.pythonhosted.org偶发403错误
故障表现
- 安装包含cffi依赖的Python模块时,配置trusted hosts参数执行pip install命令偶发403错误,重复执行相同命令数次后才可安装成功
- 安装lxml依赖时会复现相同问题,核心故障特征为访问files.pythonhosted.org时出现间歇性异常
复现所用安装命令
pip install mypythonlib --extra-index-url http://artifactoryhost/artifactory/api/pypi/orginisation/simple --trusted-host pypi.org --trusted-host files.pythonhosted.org --trusted-host corporatehost --no-cache-dir
报错日志
HTTP error 403 while getting https://files.pythonhosted.org/packages/0a/fe/f5090f4b636cef41680510fba13eee107420e6e016a8d30c386eb832a964/cffi-1.15.0-cp36-cp36m-win_amd64.whl#sha256=f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc (from https://pypi.org/simple/cffi/) ERROR: Could not install requirement cffi>=1.12 from https://files.pythonhosted.org/packages/0a/fe/f5090f4b636cef41680510fba13eee107420e6e016a8d30c386eb832a964/cffi-1.15.0-cp36-cp36m-win_amd64.whl#sha256=f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc (from cryptography>=1.3->requests-kerberos==0.12.0-pyadwutil>=1.1.4->pymip) because of HTTP error 403 Client Error: Forbidden for url: https://files.pythonhosted.org/packages/0a/fe/f5090f4b636cef41680510fba13eee107420e6e016a8d30c386eb832a964/cffi-1.15.0-cp36-cp36m-win_amd64.whl for URL https://files.pythonhosted.org/packages/0a/fe/f5090f4b636cef41680510fba13eee107420e6e016a8d30c386eb832a964/cffi-1.15.0-cp36-cp36m-win_amd64.whl#sha256=f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc (from https://pypi.org/simple/cffi/)
故障原因
--trusted-host参数仅作用是跳过对应域名的HTTPS证书校验,完全无法解决访问拦截类问题。
该类偶发403的核心诱因是files.pythonhosted.org作为PyPI官方静态资源CDN,存在多层边缘节点,企业网络出口策略、本地代理规则、CDN节点的频率/流量拦截机制会随机拦截部分请求,返回403状态码;重试时请求调度到其他正常节点即可恢复。cffi、lxml这类体积较大的二进制wheel包,因请求耗时更长、流量占比更高,触发拦截规则的概率远大于小体积纯Python包。
修复方案
- 给pip增加内置重试参数,无需手动重复执行命令:在原有安装命令后追加
--retries 10 --timeout 60参数,pip会自动对失败的请求做指数退避重试,适配偶发的节点拦截场景。调整后的命令参考:
pip install mypythonlib --extra-index-url http://artifactoryhost/artifactory/api/pypi/orginisation/simple --trusted-host pypi.org --trusted-host files.pythonhosted.org --trusted-host corporatehost --no-cache-dir --retries 10 --timeout 60
- 优先使用企业内部Artifactory源全量代理公网PyPI:将命令中的
--extra-index-url替换为--index-url,统一从内部源拉取所有依赖,从根源避免直接访问公网CDN被拦截,同时还能提升依赖下载速度。 - 移除不必要的
--no-cache-dir参数:本地已下载过的依赖会直接从缓存读取,无需重复向公网CDN发起请求,大幅降低触发拦截的概率。 - 检查本地网络代理配置:如果本地开启了全局网络代理,确认代理规则未拦截PyPI域名的请求,可临时关闭代理测试是否复现故障,或通过pip的
--proxy参数指定合法的代理地址。
内容的提问来源于stack exchange,提问作者mogoli
相关产品推荐
相关产品推荐

