pip 安装三方包失败,常见的情况有三种:不能访问源所在服务器;Python 版本不支持;和本地版本冲突。
不能访问源服务器
对于这张问题,有两种解决方法
# 方法一
pip config set global.index-url <源服务器>
pip config set install.trusted-host <源服务器域名>
pip install -i <源服务器> --trusted-host <源服务器域名> <package-name>
这两种方式都可以指定新的源服务器,特别是有自建的源服务器时,可以使用这两种方法指定使用哪个源。
Python 版本不支持
这种情况最好的方法就是使用对应版本的 python。
多个 python 环境管理,最好用的工具就是 conda,我们可以去官网,根据需要选择 Miniconda 或者 Anaconda。
和本地版本冲突
常用方案
对于这种情况,一种是卸载本地重新安装,另一种是使用 conda 管理多个环境。
常用的相关参数有
# 忽略本地缓存
--no-cache-dir
# 强制重新安装
--force-reinstall
# 升级本地缓存
--upgrade
# 如果网速慢,经常因为超时加载失败,可以使用这个参数
--default-timeout=100000
上面这几个参数可以解决绝大多数依赖库冲突的问题
ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE. If you have updated the package versions, please update the hashes. Otherwise, examine the package contents carefully; someone may have tampered with them.
pyDOE from https://files.pythonhosted.org/packages/bc/ac/91fe4c039e2744466621343d3b8af4a485193ed0aab53af5b1db03be0989/pyDOE-0.3.8.zip#sha256=cbd6f14ae26d3c9f736013205f53ea1191add4567033c3ee77b7dd356566c4b6 (from doepy==0.0.1):
Expected sha256 cbd6f14ae26d3c9f736013205f53ea1191add4567033c3ee77b7dd356566c4b6
Got fa88f67415c0cd1b3c93643b2e8596e168ce2a6a26decaf7fb67e57b04b816d9
包括绝大多数上面这种报错。
但是,但是,但是,凡事有个但是。某些情况下,上面的 hash 不匹配的报错无法解决。原因未知。
终极方案
whl 安装
此时可以尝试的方案有两种,一种是本地安装 whl;另一种是从源码安装。
https://www.piwheels.org/ 这个网站可以搜索并下载指定库的 whl 版本。然后使用 pip install <path-to-whl>.whl
就可以安装。
源码安装
https://pypi.org/ 这个网站可以搜索并下载安装三方库的源代码。
源码里会有 setup.py
。通过下面的代码可以把源代码安装到本地
# 编译
python setup.py build
# 安装
python setup.py install
没有访问权限
这种情况比较罕见。唯一遇到的一次是使用 matlab。因为 python 调用 matlab 需要先安装对应依赖库,这些库没有放到 python 官方仓库。而是需要执行本地的安装脚本实现依赖库的安装。
有一次做基于 gitlab 的 CI/CD,部署 python(使用 conda 管理环境)。因为 gitlabrunner 用户的权限限制,导致安装 matlab 依赖失败。因为 Windows Server 服务器的策略限制,导致 Invoke-Command
(可以用指定的用户运行指定的脚本/命令)这种方式不能使用。
最用使用 PYTHONPATH
这种方式曲折实现。具体方法是,安装 matlab 依赖时可以指定目录。当安装完成后给 gitlabrunner 账户添加这个路径的访问权限。然后把这个路径添加到 PYTHINPATH
中,这样就可以实现对应的环境可以使用 matlab 依赖库。