离线安装适用于网络有问题的环境、inbound 入口被限制等情况。
Wheel 包不适配
Wheel 包的名称含义
distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl
-- 来自 https://www.python.org/dev/peps/pep-0425/#use
例子:greenlet-0.4.12-cp27-cp27m-manylinux1_x86_64.whl
,这里省略了 {python tag}
。
平台不适配
由于默认情况下,wheel 包的平台是运行 pip download
命令 的平台,所以可能出现平台不适配的情况。比如在 MacOS 系统下得到的 pymongo-2.8-cp27-none-macosx_10_10_intel.whl
就不能在 linux_x86_64
安装。
很自然地,我们会想到去更改 pip download
生成的 wheel 包对应的平台。依照官方的例子
$ pip download --only-binary=:all: --platform linux_x86_64 --python-version 33 --implementation cp --abi cp34m pip>=8
-- 来自 https://pip.pypa.io/en/stable/reference/pip_download/#examples
我们可以正常运行。
但是运用以上命令安装多个包时,你会发现很多包都找不到。
$ pip download > --only-binary=:all: > --platform linux_x86_64 > --python-version 33 > --implementation cp > --abi cp34m > tornado
Collecting tornado
Could not find a version that satisfies the requirement tornado (from versions: )
No matching distribution found for tornado
我猜测是对应的项目没有提供符合条件的二进制包。
Abi tag 不适配
查看 Python 支持的 tag
目标机器
$ python -c "from pip import pep425tags;print(pep425tags.supported_tags)"
[('cp27', 'cp27m', 'manylinux1_x86_64'), ('cp27', 'cp27m', 'linux_x86_64'), ('cp27', 'none', 'manylinux1_x86_64')...]
打包机器
[('cp27', 'cp27mu', 'manylinux1_x86_64'), ('cp27', 'cp27mu', 'linux_x86_64'),
如果在是通过 cp27mu
打出的包,那么在目标机器就不能安装,因为目标机器没有 cp27mu
。错误信息为 package.whl is not a supported wheel on this platform
解决办法
使用非二进制包安装。
pip download --no-binary=:all: package_name
# --no-binary=:all: 对于包以及包的依赖包,都不使用二进制
# -- 来自 https://pip.pypa.io/en/stable/reference/pip_download/#cmdoption-no-binary
对于下载下来的 tar.gz
文件,可以直接使用 pip install
安装。相比 wheel 包,这种包在安装时会进行编译,所以花费的时间会长一些。
更进一步
使用上面的解决办法有两种情况
- 挑出不兼容的包,然后使用下载非二进制包。结果是二进制包和非二进制包混合
- 不进行挑选,全部下载非二进制包。由于非二进制包在安装时要进行编译,所以安装时间会更长
最好的情况是提供适配目标机器的二进制包。
- 找到与目标机器 Python 环境相同的机器
- 下载非二进制包
- 在与目标机器相同的环境进行编译
关于第三点,因为
Build a wheel that’s named such that it’s only usable on the platform that it was built on -- 来自 https://packaging.python.org/tutorials/distributing-packages/#platform-wheels
完整步骤
- 安装 pip2pi。
pip install pip2pi
- 使用 pip2pi 下载并打包。
pip2pi packages/ --no-use-wheel -r absolute_path_to/requirements.txt
- 压缩
tar zcfv packages.tar.gz packages/
- 上传到目标服务器。
- 解压
tar zxvf packages.tar.gz
- (可选,因为我把 virtualenv 也放入了 requirements.txt 中)安装虚拟环境。
pip install --index-url=file://absolute_path_to/packages/simple virtualenv
(注意这里的simple
) - 创建虚拟环境
virtualenv env
- 激活虚拟环境
source env/bin/activate
- 安装剩余依赖。
pip install --index-url=file://absolute_path_to/packages/simple -r requirements.txt