pip 离线安装

离线安装适用于网络有问题的环境、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 包,这种包在安装时会进行编译,所以花费的时间会长一些。

更进一步

使用上面的解决办法有两种情况

  1. 挑出不兼容的包,然后使用下载非二进制包。结果是二进制包和非二进制包混合
  2. 不进行挑选,全部下载非二进制包。由于非二进制包在安装时要进行编译,所以安装时间会更长

最好的情况是提供适配目标机器的二进制包。

  1. 找到与目标机器 Python 环境相同的机器
  2. 下载非二进制包
  3. 在与目标机器相同的环境进行编译

关于第三点,因为

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

完整步骤

  1. 安装 pip2pipip install pip2pi
  2. 使用 pip2pi 下载并打包。pip2pi packages/ --no-use-wheel -r absolute_path_to/requirements.txt
  3. 压缩 tar zcfv packages.tar.gz packages/
  4. 上传到目标服务器。
  5. 解压 tar zxvf packages.tar.gz
  6. (可选,因为我把 virtualenv 也放入了 requirements.txt 中)安装虚拟环境。pip install --index-url=file://absolute_path_to/packages/simple virtualenv(注意这里的 simple
  7. 创建虚拟环境 virtualenv env
  8. 激活虚拟环境 source env/bin/activate
  9. 安装剩余依赖。pip install --index-url=file://absolute_path_to/packages/simple -r requirements.txt
posted @ 2018-01-22 20:32  Jay54520  阅读(8938)  评论(0编辑  收藏  举报