Python 包管理机制详解介绍


Python 中可以通过 PIP 来自动管理依赖包,当然,也可以下载源码或者二进制包,有些源码包需要编译环境,最好直接下载安装二进制包。

包安装

Python 中可以通过 PIP 来自动管理依赖包,如果机器上没有安装,可以通过包管理工具安装,例如 CentOS 中的 yum 。

对于三方库,如果机器上没有安装,那么可以直接从 pypi.org 上下载源码包,然后通过 python setup.py install 命令安装,其中依赖的 setuptools 也可以直接通过上述的源码安装方式。

很多 Python 包可以直接从 www.pypi.org 上获取源码包,例如 ipython 包,当然需要注意版本号,部分可能只支持 Python3。

例如,如果 python 的环境为 2.X 版本,那么可以通过 pip install ipython==5.8.0 安装。

安装方式

如上,最简单的是直接通过 pip 命令行安装,不过需要联网才可以,否则无法下载。

# pip install scikit-learn
# easy_install scikit-learn

另外,一种方式是直接离线下载完之后,通过如下命令安装。

$ python setup.py build
$ python setup.py install

PIP 简介

Python 中的包管理工具,常见操作如下,可以包含一个 requirements.txt 文件,用于保存当前依赖包及其精确的版本号。

----- 列出已安装的包,freeze一般是老版本使用,可以用于导出requirements.txt
# pip freeze > requirements.txt
# pip list

----- 在线安装,也可以指定具体的版本要求
# pip install <PKG-Name>
# pip install -r requirements.txt
# pip install "django==1.9"
# pip install "django>1.9"
# pip install "django><1.9"

----- 安装本地包
# pip install <Your/Source/Directory>

----- 卸载包
# pip uninstall <PKG-Name>
# pip uninstall -r requirements.txt

----- 升级包,可以自升级
# pip install -U <PKG-Name>

----- 显示包所在的目录
# pip show -f <PKG-Name>

----- 搜索包
# pip search <KEY-Word>

----- 查询可升级的包
# pip list -o

----- 只下载包而不安装
# pip install <PKG-Name> -d <Directory>
# pip install -d <Directory> -r requirements.txt

----- 指定下载的源地址
# pip install <PKG-Name> -i http://pypi.v2ex.com/simple
----- 查看当前源配置
# pip config list

在查看已经安装包时,不会显示 python setup.py install 这种方式安装的包,可通过 python -c "help('modules')" 查看已经安装的包,不过没有版本号;据说有个 yolk 工具可以使用,没有验证过。

指定全局安装源

*nixMacOS 中,配置文件为 $HOME/.pip/pip.conf ,对于 Windows 保存在 C:\Users\<USRNAME>\pip\pip.ini 文件中,一般的内容如下。

[global]
timeout = 6000
trusted-host = pypi.douban.com
index-url = https://pypi.douban.com/simple

常用的源有:

  • 豆瓣 https://pypi.douban.com/simple
  • 中国科学技术大学 https://mirrors.ustc.edu.cn/pypi/web/simple/
  • 清华大学TUNA https://pypi.tuna.tsinghua.edu.cn/simple
  • 华为云 https://repo.huaweicloud.com/repository/pypi/simple

如果要临时指定,那么可以通过类似 --trusted-host pypi.douban.com -i http://pypi.douban.com/simple 参数。

Python 3

如上的环境准备过程中,当通过 yum install python36-pip 安装了对应 V3 版本,如果没有连接到 pip 命令,此时对应的命令行是 pip3 而非 pip ,也就是需要保证 pip 是相同的版本。

# pip3 install --upgrade pip3

关于 PIP 的详细使用方式可以参考 Python 包安装工具

代理设置

可以通过 export https_proxy='https://USR:PASS@HOSTNAME:PORT' 设置代理,注意在使用时密码尽量不要带有类似 # $ @ 等这种特殊的字符,否则可能会鉴权失败。

包命名格式

在安装 Python 包的时候,通常是使用 PIP 直接解决依赖问题,也就是 Wheel 包,其命名格式为。

{distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl

其中 distribution 为包名称,可以使用下划线,version 对应了版本号,剩余参数会比较麻烦,介绍如下。通过 python tag 标识具体 Python 的实现,有如下几种:

  • py 只依赖 Python 语言,一般是 py2.py3 ,也就是兼容;或者 py2、py3 只兼容特定版本。
  • cp CPython 通常使用的实现,大多数平台,使用最广泛。
  • ip IronPython 跑在 Windows CLI 平台上的 Python 实现。
  • pp PyPy 带 JIT 的 Python 实现。
  • jy Jython 跑在 JVM 上的 Python 实现。

接着 api tag 为 API 标签,如 cp27mu,后面 platform tag 为平台信息,例 linux_aarch64linux_x86_64 等。

cp27m VS. cp27mu

在 CPython 3.3 之前的版本,编译时有两个选项 --enable-unicode=ucs2--enable-unicode=ucs4 ,所以,很多的一些发行版本,为了兼容会对应提供 cp27mcp27mu 两个版本。

当前支持标签

可以通过如下的方式查看当前 Python 环境所支持的 wheel 包。

# x86_32 查看
import wheel.pep425tags
print(wheel.pep425tags.get_supported())

# x86_64 查看
import pip
print(pip.pep425tags.get_supported())

其输出为 ('python Tag','abi Tag','platform tag')

离线安装包

有时候需要离线安装包,可以直接从仓库下载二进制文件即可,也可以省去编译过程。从仓库下载对应的 XXX.whl 安装包,并通过 pip install XXX.whl 即可。另外,如果发现有 XXX.egg 文件,那么可以通过 easy_install XXX.egg 命令安装。

----- 先离线下载包,可以指定包或者文件
$ pip download -d /opt/pip/tmp ansible
$ pip download -d /opt/pip/tmp -r requirement.txt

----- 安装
$ pip install --no-index --find-links="/opt/pip/tmp" ansible
$ pip install --no-index --find-links="/opt/pip/tmp" -r requirements.txt

另外,我们可能需要在 x86 机器上下载 arm 的包,那么就需要使用如下的参数,如下是常见的方式。

--only-binary=:all:       \   # 只下载二进制包
--python-version 27       \   # Python 版本,也就是 2.7
--implementation cp       \   # 使用 cpython 实现,一般都是这个
--platform linux_aarch64  \   # 可以指定多个,也就是 Linux ARM 64Bits
--abi cp27mu              \   # 可以指定多个,支持的 ABI

参考

  • pip download 关于 PIP 下载命令的详细介绍,包括了一些常见的使用方式。