本文概览
本文主要讲述 pip 离线安装包的相关事宜,
主要针对内网无法直接使用pip安装的情况, 使用的是linux 服务器
- 由于大多数情况下都可直接使用
pip install -r requirements.txt
- 我的讲述重点是能够学会离线的环境下批量安装python库
- 会兼顾一些常见问题和基础知识,本文不会讲的太深,在一些地方会给出链接,以便深入讨论该主题
- 本文不仅仅是为了写出解决方案,更多地是学习python 库的基础知识,以便遇见问题时能够自行解决
本文目录
- python库的安装方法 主要讲安装python 库的几种方式及其分析
- pip, pypi与python 库 主要讲安装pip 的安装方法,与python 库的各种分类
- 操作步骤 主要讲整体操作
- 常见问题 各种安装或异常情况的问题及其处理
该文也是边学习边总结中不断修改,不断更新的,希望能够帮助到你,有问题可留言评论
一、 python库的安装方法
常见的安装方法
- 直接在 pypi 官网下载,而后进行手动安装
- 使用 pip 根据requirements文件下载安装包,到离线环境中再使用 pip 安装
- 通过docker 安装相应环境,高级版
- 通过 Ansible 自动化部署,超级版
各种方式优劣
- 第一种效率低,但可以解决一两个包的安装,暂时性地解决问题
- 第二种是本文推荐的方式,可以批量的下载,并且批量安装,解决的是一台服务器上安装多个包的问题
- 第三种这种方式可以将python 环境进行复制,更适合于多个服务器的安装
- 不了解,有兴趣可以自行学习
二、pip, pypi与python 库
pypi 是存储 python 库(package) 并可通过 pip 进行安装的一个平台
- python 库 比作货物,pypi 就是存储货物的仓库,而pip 可以想象成 pypi 的管理人员,帮助你获取python 库
- pip 也是一个python 库,是 easy_install 的升级版,两者就好像 rpm 和 yum 一样
- pypi 是一个python 库的官方存储仓库,相应的还有一些镜像源,用来提升速度的
python 库
- python 库是什么
python 库本质上就是一个python 程序包,路径一般在/usr/lib/python3.6/site-packages
下
python 库很重要的一点是 库与库之间是相互依赖的,还有python 库的版本问题也很重要 - python 库的常见分类
- 是否需要安装后才可使用,可以分为标准库(内置库)和第三方库
- 按照操作系统,可以大致分为 windows 和 UNIX 系统两类
- 按照python 版本,可以分为 python 2 ,python 3.6,python 3.7 等等
- 按照解释器,可以分为 cp(C语言 解释器),jp(Java 解释器),IronPython(.Net 解释器)等等
- 并且库本身还有很多版本,相应版本之间也会有差异
- 按照安装包的方式可以分为, 源码包,wheel 包, egg包
- 源码包,wheel 包与 egg 包
- 常见的是 源码包和wheel 包,egg 已经较少了
- 源码包就是二进制包,一般安装后会有一个可执行文件
- wheel 包是一种包的格式,可直接使用
pip install xxx.whl
进行安装 - egg 包是以前的版本,相对来说,wheel 格式是 egg 格式的升级版本 ,可使用
python setup.py xxx.egg
进行安装
- wheel包的命名方式(源码包只有包的版本号)
- wheel包名官方文档
- wheel 包的命名格式为
{distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl
- 例如
mysql_connector-2.1.6-cp36-cp36m-win_amd64.whl
- 一些通用的包可以使用 no 或者 any 对相应字段进行替换,例如这个包是linux 和 windows 都通用的,就可以在platform 上写 any
- 查看本机python 可支持的wheel版本
[root@xxx dir]python3 >>>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'), ('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')]
名称 | 对应名称 | 解释 |
---|---|---|
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
- 下载 uwsgi 源码包, Pypi 官网下载
- 解压
tar -zxvf uwsgi.tar.gz
- 进入目录
cd uwsgi
- 使用python 安装
python3 setup.py install
- 即可安装成功
更简单的方法
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 上进行安装,这样八成装不上
- 这两条命令的区别在于wheel 方式下载会将下载的包放入wheel 缓存,但缺点是wheel 不可以下载源码包
- download 命令会查看wheel缓存,然后再去PyPI下载库,但download命令下载的包不会进入wheel缓存,download 的优点是可以下载源码包
- 需要注意,使用wheel 方式安装可能会报错,因为有些包是源码包,不能被打包成wheel 格式
- download 方法下载的包,不会对依赖性进行检查,这意味着,如果下载 Flask-PyMongo 这个包,只会下载该包,而不会下载 pymongo,经试验发现,download 适合补充wheel不可下载的包,两者搭配使用,才能将requirements文件的库完整的下载
- 注意: 如果只使用download 方法下载,很有可能安装时候会报错
3. 将文件打包后放到离线服务器上,并进行解压缩
下载后执行下面的命令就可以进行安装了
$ pip3 install --no-index --find-links=DIR -r requirements.txt
命令说明
- freeze 将依赖关系分析出来并 使用管道符导入到该文件中
- download 分析 requirements 文件,将所有包进行下载,通过 d 选项导入 DIR 文件夹
- wheel 分析requirements 文件,并将所有包及其依赖包下载为 wheel 格式,通过 w 选项导入 DIR 文件夹中
--find-links
指定离线安装的文件夹DIR
,也就是你下载好的包- 注意: --no-index 必须搭配 --find-links 使用
--no-index¶ Ignore package index (only looking at --find-links URLs instead).
四、常见问题
-
注意生产环境是什么平台,如果是Linux,你需要在虚拟机中下载 wheel包,切记
- 包名中有 win ,代表只能在windows 中安装
- 没有 win,代表跨平台
-
安装时报错,不能找到相应的包,打开文件夹后却发现有
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))
- 原因是该库是3.7 版本,而服务器是3.6 版本,导致安装不上
- 使用以下命令选择合适的版本,注意
--no-deps
不可缺少,参考官方文档 -
pip3 download --no-deps --platform linux_x86_64 --python-version 36 --implementation cp --abi cp36m -r requirements.txt -d pk
-
下载时报错
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
- 问题原因,因为这些包的格式是 tar.gz,也就是源码包,是不可以直接转为 wheel 包的
- 可参考上面源代码安装方式
-
安装报错
- 由于服务器自带的是python2,存在python 3 和 python 2 两个版本共存的情况
- pip 版本错了,换成 pip3 就OK了
PyPI 服务器搭建
- https://www.cnblogs.com/special-li/p/9149573.html
- 可以通过 pypi-server 或者开源镜像仓库Nexus实现
- Nexus 官网 https://www.sonatype.com/nexus/repository-oss
- pypi-server https://github.com/pypiserver/pypiserver