pypi 下载离线包并离线安装

下载 PyPI 包为离线文件,并在无外网服务器上安装


一、查询软件包

查询当前环境安装的所有软件包

shell
1
pip list

查询 pypi 上含有某名字的包

shell
1
pip search <pkg>

查询当前环境中可升级的包

shell
1
pip list --outdated

查询一个包的详细内容

shell
1
pip show <pkg>

二、下载软件包

在不安装软件包的情况下下载软件包到本地

shell
1
pip download --destination-directory /local/wheels -r requirements.txt

下载完,总归是要安装的,可以指定这个目录中安装软件包,而不从 pypi 上安装。

shell
1
pip install --no-index --find-links=/local/wheels -r requirements.txt

当然你也从你下载的包中,自己构建生成 wheel 文件

shell
1
2
pip install wheel
pip wheel --wheel-dir=/local/wheels -r requirements.txt

三、安装软件包

使用 pip install <pkg> 可以很方便地从 pypi 上搜索、下载并安装 python 包。

如下所示

shell
1
pip install requests

这是安装包的基本格式,我们也可以为其添加更多参数来实现不同的效果。

1. 只从本地安装,而不从 pypi 安装

前提你得保证你已经下载 pkg 包到 /local/wheels 目录下

1
pip install --no-index --find-links=/local/wheels <pkg>

2. 限定版本进行软件包安装

以下三种,对单个 python 包的版本进行了约束

  • 所安装的包的版本为 2.1.2

    1
    pip install pkg==2.1.2
  • 所安装的包必须大于等于 2.1.2

    shell
    1
    pip install pkg>=2.1.2
  • 所安装的包必须小于等于 2.1.2

    shell
    1
    pip install pkg<=2.1.2

以下命令用于管理/控制整个 python 环境的包版本

  • 导出依赖包列表

    shell
    1
    pip freeze >requirements.txt
  • 从依赖包列表中安装

    shell
    1
    pip install -r requirements.txt
  • 确保当前环境软件包的版本(并不确保安装)

    shell
    1
    pip install -c constraints.txt

3. 限制不使用二进制包安装

由于默认情况下,wheel 包的平台是运行 pip download 命令的平台,所以可能出现平台不适配的情况。

比如在 MacOS 系统下得到的 pymongo-2.8-cp27-none-macosx_10_10_intel.whl 就不能在 linux_x86_64 安装。

使用下面这条命令下载的是 tar.gz 的包,可以直接使用 pip install 安装。

相对 wheel 包,这种包在安装时会进行编译,所以花费的时间会长一些。

  1. 下载非二进制的包

    shell
    1
    pip download --no-binary=:all: <pkg>
  2. 安装非二进制的包

    shell
    1
    pip install <pkg> --no-binary

4. 指定代理服务器安装

当你身处在一个内网环境中时,无法直接连接公网。这时候你使用 pip install 安装包,就会失败。

面对这种情况,可以有两种方法:

  1. 下载离线包拷贝到内网机器中安装
  2. 使用代理服务器转发请求

第一种方法,虽说可行,但有相当多的弊端

  • 步骤繁杂,耗时耗力
  • 无法处理包的依赖问题

这里重点来介绍,第二种方法:

shell
1
pip install --proxy [user:passwd@]http_server_ip:port <pkg>

每次安装包就发输入长长的参数,未免有些麻烦,为此你可以将其写入配置文件中:

$HOME/.pip/pip.conf

对于这个路径,说明几点

  1. 不同的操作系统,路径各不相同

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # Linux/Unix:
    /etc/pip.conf
    ~/.pip/pip.conf
    ~/.config/pip/pip.conf

    # Mac OSX:
    ~/Library/Application Support/pip/pip.conf
    ~/.pip/pip.conf
    /Library/Application Support/pip/pip.conf

    # Windows:
    %APPDATA%\pip\pip.ini
    %HOME%\pip\pip.ini
    C:\Documents and Settings\All Users\Application Data\PyPA\pip\pip.conf (Windows XP)
    C:\ProgramData\PyPA\pip\pip.conf (Windows 7及以后)
  2. 若在你的机子上没有此文件,则自行创建即可

如何配置,这边给个样例:

~/.pip/pip.conf
1
2
3
4
5
6
7
8
9
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/

# 替换出自己的代理地址,格式为[user:passwd@]proxy.server:port
proxy=http://xxx.xxx.xxx.xxx:8080

[install]
# 信任阿里云的镜像源,否则会有警告
trusted-host=mirrors.aliyun.com

四、卸载软件包

shell
1
pip uninstall <pkg>

五、升级软件包

想要对现有的 python 进行升级,其本质上也是先从 pypi 上下载最新版本的包,再对其进行安装。所以升级也是使用 pip install,只不过要加一个参数 --upgrade

shell
1
pip install --upgrade <pkg>

在升级的时候,其实还有一个不怎么用到的选项 --upgrade-strategy,它是用来指定升级策略。

它的可选项只有两个:

  • eager :升级全部依赖包
  • only-if-need:只有当旧版本不能适配新的父依赖包时,才会升级。

在 pip 10.0 版本之后,这个选项的默认值是 only-if-need,因此如下两种写法是一互致的。

shell
1
2
3
pip install --upgrade <pkg> 

pip install --upgrade <pkg> --upgrade-strategy only-if-need

六、pypi 离线安装问题解决

下载pip 库后,使用命令 pip install --no-index --find-links=/local/wheels -r requirements.txt 安装时出现如下报错:

1
2
3
4
...
Collecting hiredis (from aioredis~=1.0->channels-redis==2.4.0->-r /opt/jumpserver/requirements/requirements.txt (line 90))
Could not find a version that satisfies the requirement hiredis (from aioredis~=1.0->channels-redis==2.4.0->-r /opt/jumpserver/requirements/requirements.txt (line 90)) (from versions: )
No matching distribution found for hiredis (from aioredis~=1.0->channels-redis==2.4.0->-r /opt/jumpserver/requirements/requirements.txt (line 90))

查看 pip 下载文件夹中发现有相关包

1
2
# ll hiredis-1.0.1-cp36-cp36m-manylinux2010_x86_64.whl
-rw-r--r-- 1 root root 59336 Mar 9 10:01 hiredis-1.0.1-cp36-cp36m-manylinux2010_x86_64.whl

查看当前 pip 支持的文件名还有版本

1
2
3
4
# python
>>> import pip
>>> print(pip.pep425tags.get_supported())
[('cp36', 'cp36m', 'manylinux1_x86_64'), ('cp36', 'cp36m', 'linux_x86_64'), ('cp36', 'abi3', 'manylinux1_x86_64'), ('cp36', 'abi3', 'linux_x86_64'), ('cp36', 'none', 'manylinux1_x86_64'), ('cp36', 'none', 'linux_x86_64'), ('cp35', 'abi3', 'manylinux1_x86_64'), ('cp35', 'abi3', 'linux_x86_64'), ('cp34', 'abi3', 'manylinux1_x86_64'), ('cp34', 'abi3', 'linux_x86_64'), ('cp33', 'abi3', 'manylinux1_x86_64'), ('cp33', 'abi3', 'linux_x86_64'), ('cp32', 'abi3', 'manylinux1_x86_64'), ('cp32', 'abi3', 'linux_x86_64'), ('py3', 'none', 'manylinux1_x86_64'), ('py3', 'none', 'linux_x86_64'), ('cp36', 'none', 'any'), ('cp3', 'none', 'any'), ('py36', 'none', 'any'), ('py3', 'none', 'any'), ('py35', 'none', 'any'), ('py34', 'none', 'any'), ('py33', 'none', 'any'), ('py32', 'none', 'any'), ('py31', 'none', 'any'), ('py30', 'none', 'any')]

退出 python 并更改相关包文件名

1
# mv hiredis-1.0.1-cp36-cp36m-manylinux2010_x86_64.whl hiredis-1.0.1-cp36-cp36m-manylinux1_x86_64.whl

再次重新安装,即可成功。

参考文章:

评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...