• 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
  • 相关阅读:
    ----uni-app之解决底部按钮绝对定位后被软键盘推起的bug----
    ----uni-app之解决app手机键盘消失后页面往上滚的问题----
    mysql tips
    mysql 添加行号
    mysql中的几种join 及 full join问题
    Dcoker中启动mysql,并实现root远程访问
    DockerToolbox在Win7上的安装和设置
    Class.getResourceAsStream 和 ClassLoder.getResourceAsStream 的区别
    tomcat 启动异常 EOFException: Unexpected end of ZLIB input stream
    java异常处理-finally中使用return和throw语句
  • 原文地址:https://www.cnblogs.com/jay54520/p/8330994.html