pip 通过 requirements 文件,批量下载python包,批量离线安装python包

本文概览

本文主要讲述 pip 离线安装包的相关事宜,
主要针对内网无法直接使用pip安装的情况, 使用的是linux 服务器

  1. 由于大多数情况下都可直接使用 pip install -r requirements.txt
  2. 我的讲述重点是能够学会离线的环境下批量安装python库
  3. 会兼顾一些常见问题和基础知识,本文不会讲的太深,在一些地方会给出链接,以便深入讨论该主题
  4. 本文不仅仅是为了写出解决方案,更多地是学习python 库的基础知识,以便遇见问题时能够自行解决

本文目录

  1. python库的安装方法 主要讲安装python 库的几种方式及其分析
  2. pip, pypi与python 库 主要讲安装pip 的安装方法,与python 库的各种分类
  3. 操作步骤 主要讲整体操作
  4. 常见问题 各种安装或异常情况的问题及其处理

该文也是边学习边总结中不断修改,不断更新的,希望能够帮助到你,有问题可留言评论

一、 python库的安装方法

  • 更多关于python 库安装的资料

常见的安装方法

  1. 直接在 pypi 官网下载,而后进行手动安装
  2. 使用 pip 根据requirements文件下载安装包,到离线环境中再使用 pip 安装
  3. 通过docker 安装相应环境,高级版
  4. 通过 Ansible 自动化部署,超级版

各种方式优劣

  1. 第一种效率低,但可以解决一两个包的安装,暂时性地解决问题
  2. 第二种是本文推荐的方式,可以批量的下载,并且批量安装,解决的是一台服务器上安装多个包的问题
  3. 第三种这种方式可以将python 环境进行复制,更适合于多个服务器的安装
  4. 不了解,有兴趣可以自行学习

二、pip, pypi与python 库

  • pip 官方文档
  • pip 快速上手
  • pypi 官网
  • python package官方文档

pypi 是存储 python 库(package) 并可通过 pip 进行安装的一个平台

  1. python 库 比作货物,pypi 就是存储货物的仓库,而pip 可以想象成 pypi 的管理人员,帮助你获取python 库
  2. pip 也是一个python 库,是 easy_install 的升级版,两者就好像 rpm 和 yum 一样
  3. pypi 是一个python 库的官方存储仓库,相应的还有一些镜像源,用来提升速度的

python 库

  1. python 库是什么
    python 库本质上就是一个python 程序包,路径一般在 /usr/lib/python3.6/site-packages
    python 库很重要的一点是 库与库之间是相互依赖的,还有python 库的版本问题也很重要
  2. python 库的常见分类
    1. 是否需要安装后才可使用,可以分为标准库(内置库)和第三方库
    2. 按照操作系统,可以大致分为 windows 和 UNIX 系统两类
    3. 按照python 版本,可以分为 python 2 ,python 3.6,python 3.7 等等
    4. 按照解释器,可以分为 cp(C语言 解释器),jp(Java 解释器),IronPython(.Net 解释器)等等
    5. 并且库本身还有很多版本,相应版本之间也会有差异
    6. 按照安装包的方式可以分为, 源码包,wheel 包, egg包
  3. 源码包,wheel 包与 egg 包
    1. 常见的是 源码包和wheel 包,egg 已经较少了
    2. 源码包就是二进制包,一般安装后会有一个可执行文件
    3. wheel 包是一种包的格式,可直接使用 pip install xxx.whl 进行安装
    4. egg 包是以前的版本,相对来说,wheel 格式是 egg 格式的升级版本 ,可使用 python setup.py xxx.egg进行安装
  4. wheel包的命名方式(源码包只有包的版本号)
    1. wheel包名官方文档
    2. wheel 包的命名格式为 {distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl
    3. 例如 mysql_connector-2.1.6-cp36-cp36m-win_amd64.whl
    4. 一些通用的包可以使用 no 或者 any 对相应字段进行替换,例如这个包是linux 和 windows 都通用的,就可以在platform 上写 any
名称 对应名称 解释
distribution mysql_connector 包名
version 2.1.6 版本
bulid tag 备注标签 可省略
python-tag cp36 表示 cpython 3.6 版本
abi-tag cp36m abi Application Binary Interface
应用程序二进制接口
platform win_amd64 platform 还可以是 any
win32 , linux_i386 , linux_x86_64, any 表示 跨平台

三、操作步骤

1. 源码包手动安装

以 uwsgi 为例,在linux 上安装uwsgi

  1. 下载 uwsgi 源码包, Pypi 官网下载
  2. 解压 tar -zxvf uwsgi.tar.gz
  3. 进入目录 cd uwsgi
  4. 使用python 安装 python3 setup.py install
  5. 即可安装成功

更简单的方法

  • pip3 install uwsgi-2.0.18.tar.gz

2. pip 安装 官方说明

In some cases, you may want to install from local packages only, with no traffic to PyPI.

1. 首先,在项目中分析出所有依赖的库

  • pip freeze > requirements.txt # 该方法仅可以使用在虚拟环境中,会将python 解释器下的所有包都导出
  • pipreqs ./ --encoding=utf-8 --force # 表示覆盖该原有requirements.txt

2. 将所有包下载到DIR这个目录中

  • $ pip download -d DIR -r requirements.txt
  • $ pip wheel -w DIR -r requirements.txt

切记,不要在 windows 下载包,然后放到 Linux 上进行安装,这样八成装不上

  1. 这两条命令的区别在于wheel 方式下载会将下载的包放入wheel 缓存,但缺点是wheel 不可以下载源码包
  2. download 命令会查看wheel缓存,然后再去PyPI下载库,但download命令下载的包不会进入wheel缓存,download 的优点是可以下载源码包
  3. 需要注意,使用wheel 方式安装可能会报错,因为有些包是源码包,不能被打包成wheel 格式
  4. download 方法下载的包,不会对依赖性进行检查,这意味着,如果下载 Flask-PyMongo 这个包,只会下载该包,而不会下载 pymongo,经试验发现,download 适合补充wheel不可下载的包,两者搭配使用,才能将requirements文件的库完整的下载
  5. 注意: 如果只使用download 方法下载,很有可能安装时候会报错
    pip 通过 requirements 文件,批量下载python包,批量离线安装python包_第1张图片

3. 将文件打包后放到离线服务器上,并进行解压缩

下载后执行下面的命令就可以进行安装了

$ pip3 install --no-index --find-links=DIR -r requirements.txt

命令说明

  1. freeze 将依赖关系分析出来并 使用管道符导入到该文件中
  2. download 分析 requirements 文件,将所有包进行下载,通过 d 选项导入 DIR 文件夹
  3. wheel 分析requirements 文件,并将所有包及其依赖包下载为 wheel 格式,通过 w 选项导入 DIR 文件夹中
  4. --find-links 指定离线安装的文件夹DIR,也就是你下载好的包
  5. 注意: --no-index 必须搭配 --find-links 使用
    --no-index¶
    Ignore package index (only looking at --find-links URLs instead).
    

四、常见问题

  1. 注意生产环境是什么平台,如果是Linux,你需要在虚拟机中下载 wheel包,切记

    1. 包名中有 win ,代表只能在windows 中安装
    2. 没有 win,代表跨平台
  2. 安装时报错,不能找到相应的包,打开文件夹后却发现有 cffi 这个库

    Collecting cffi==1.11.5 (from -r lla/requirements.txt (line 12))
      Could not find a version that satisfies the requirement cffi==1.11.5 
        (from -r lla/requirements.txt (line 12)) (from versions: )
    No matching distribution found for cffi==1.11.5 (from -r lla/requirements.txt (line 12))
    
    1. 原因是该库是3.7 版本,而服务器是3.6 版本,导致安装不上
    2. 使用以下命令选择合适的版本,注意 --no-deps 不可缺少,参考官方文档
    3.  pip3 download 
       	--no-deps
          --platform linux_x86_64
          --python-version 36
          --implementation cp  
          --abi cp36m    
           -r requirements.txt -d pk
      
  3. 下载时报错

      Failed building wheel for alembic
      Running setup.py clean for alembic
      Running setup.py bdist_wheel for Mako ... error
      Complete output from command /usr/local/bin/python3.7 -u -c "import setuptoolstokenize;
      __file__='/tmp/pip-wheel-e6wqgb6g/Mako/setup.py';
      f=getattr(tokenize,'open', open)(__file__);
      code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))"
       bdist_wheel -d /tmp/pip-wheel-l_pjqx6k:
      usage: -c [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
         or: -c --help [cmd1 cmd2 ...]
         or: -c --help-commands
         or: -c cmd --help
    
      error: invalid command 'bdist_wheel'
    
      ----------------------------------------
      Failed building wheel for Mako
      Running setup.py clean for Mako
    Failed to build mysql-connector uwsgi SQLAlchemy alembic Mako
    ERROR: Failed to build one or more wheels
    
    
    1. 问题原因,因为这些包的格式是 tar.gz,也就是源码包,是不可以直接转为 wheel 包的
    2. 可参考上面源代码安装方式
  4. 安装报错
    pip 通过 requirements 文件,批量下载python包,批量离线安装python包_第2张图片

    1. 由于服务器自带的是python2,存在python 3 和 python 2 两个版本共存的情况
    2. pip 版本错了,换成 pip3 就OK了

PyPI 服务器搭建

  • https://www.cnblogs.com/special-li/p/9149573.html
  • 该项没有研究

你可能感兴趣的:(基础使用)