浪子大侠
浪子大侠

仗剑走江湖

Python包管理

Python的版本演变中经历很多个包管理工具,罗列如下:

distutils 、distribute、setuptools、easy_install、pip

它们有些已经成为遗产,有些是当下也可能是未来。

对几个工具做如下梳理与说明:

1.distutils

Python自带的包管理工具,是标准库的一部分。

概述:基于distutils的setup函数(from distutils.core import setup)编写对应的setup.py ,通过执行setupt.py 进行安装包及打包的操作:

from distutils.core import setup
setup(name='foo',
    version='1.0',
    py_modules=['foo'],)

python setup.py sdist #发布包

python setup.py install #安装包

2.setuptools 、distribute、 easy_install

setuptools是一个为了增强 distutils 而开发的集合,它包含了 easy_install 这个工具。

setuptools 是一个项目模块,是基础组件。而 easy_install 是这个项目中提供的工具,它依赖基础组件工作。

distribute 是 setuptools 的一个分支版本。目前,distribute 又合并回了 setuptools 中。

easy_install 是setuptools 和 distribute 自带的安装脚本,setuptools 或 distribute安装完后, easy_install便可使用

pip 是目前 python 包管理的事实标准,用来取代 easy_install

后面重点介绍pip

pip

pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。

目前如果在 python.org 下载最新版本的安装包,则是已经自带了该工具。

Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具。

pip 官网:https://pypi.org/project/pip/

官方参考文档:https://pip.pypa.io/en/stable/

1. 安装pip

通过 pip -V或 pip --version 确认pip是否正确安装

SunnyiMac:~ Sunny$ pip -V
pip 20.0.2 from /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pip (python 3.6)

如果没有正确安装,尝试从标准库中对其进行引导

SunnyiMac:~ Sunny$ python3 -m ensurepip --default-pip
Looking in links: /var/folders/29/1tq13m7946z0hz0bw0gydrxh0000gn/T/tmpabd_m36r
Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (45.2.0)
Requirement already satisfied: pip in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (20.0.2)

如果仍然无法运行,通过下述方式安装pip

wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py # 安装或更新pip,如果没有setuptools,wheel 会自动安装

确保pip, setuptools, wheel 为最新版本

pip install --upgrade pip setuptools wheel

2. 配置pip

pip允许在ini文件中设置所有命令行选项默认值

在不同平台上,配置文件的名称和位置略有不同。 按用户、虚拟环境、全局(在所有用户之间共享)分级配置:

2.1用户级配置:
Unix上,默认配置文件$HOME/.config/pip/pip.conf,该文件遵循XDG_CONFIG_HOME环境变量。
macOS上,如果目录$HOME/Library/Application Support/pip 存在,则配置文件为$HOME/Library/Application Support/pip/pip.conf,否则为$HOME/.config/pip/pip.conf
Windows上,配置文件为%APPDATA%\pip\pip.ini

还有一套老版本的用户级别配置文件规则,目前依然有效位于:

在Unix和macOS上,配置文件为:$HOME/.pip/pip.conf
在Windows上,配置文件为:%HOME%\pip\pip.ini

可以使用环境变量PIP_CONFIG_FILE为该配置文件设置自定义路径位置。

2.2 虚拟环境配置
Unix and macOS 配置文件为 $VIRTUAL_ENV/pip.conf
Windows 配置文件为 %VIRTUAL_ENV%\pip.ini
2.3 全局配置
Unix上,该文件可能位于/etc/pip.conf中。 或者,它可以位于环境变量XDG_CONFIG_DIRS(如果存在)中设置的任何路径的“ pip”子目录中,例如/etc/xdg/pip/pip.conf
macOS上,文件为:/Library/Application Support/pip/pip.conf
Windows XP上,文件为:C:\Documents and Settings\All Users\Application Data\pip\pip.ini
Windows 7和更高版本上,该文件是隐藏的,但可在C:\ProgramData\pip\pip.ini中写入
Windows Vista不支持全局配置

如果存在多个配置文件,则它们将按以下顺序组合:

全局级

用户级

虚拟环境级

简单的说:虚拟环境级覆盖用户级,用户级覆盖全局级

配置项目

配置项基于命令行参数

例如:

使用其他程序包索引(--index-url)

HTTP超时(--default-timeout)设置为60秒

[global]
timeout = 60
index-url = https://download.zope.org/ppix

对于每个子命令可以在自己部分进行单独配置,以覆盖具有相同名称的全局设置

举例如下:

将freeze 命令超时设置为10s,其他命命令超时设置为60s

[global]
timeout = 60

[freeze]
timeout = 10

install 命令配置 ignore-installed, no-dependencies

[install]
ignore-installed = true
no-dependencies = yes

install 配置 no-compile, no-warn-script-location

全局no-cache-dir 配置对所有子命令有效

[global]
no-cache-dir = false

[install]
no-compile = no
no-warn-script-location = false

像--find-links附加选项可以写在多行上:

[global]
find-links =
    http://download.example.com

[install]
find-links =
    http://mirror1.example.com
    http://mirror2.example.com
怎么查看相关配置,配置项基于命令行参数

pip --help # 只能看到pip <command> [options]

pip install --help # 子命令输入后加--help,就能看相关子命令的参数

pip同样支持 通过环境变量进行配置:

pip的命令行选项可以使用环境变量设置,格式为PIP_ <UPPER_LONG_NAME>。 短划线(-)必须替换为下划线(_)

设置环境变量export PIP_DEFAULT_TIMEOUT=60

等价

命令行选项pip --default-timeout=60 [...]

配置优先级方面:

  1. 命令行选项优先于环境变量,环境变量优先于配置文件。
  2. 在配置文件中,特定命令的部分优先于全局部分。

加餐:

解决pip安装包慢的问题

切换国内源

推荐阿里源

添加如下到pip配置文件

[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com

命令行补齐

pip 支持 bash, zsh and fish

bash安装方式:

$ pip completion --bash >> ~/.profile

具体写那个配置文件,不同系统不一样

macosx为例

$ pip completion --bash >> ~/.bash_profile

安装成功后需要重新加载sh配置

macosx如下:

source ~/.bash_profile

zsh fish 类同

zsh安装方式:

$ pip completion --zsh >> ~/.zprofile

fish安装方式:

$ pip completion --fish > ~/.config/fish/completions/pip.fish

另外,可以直接将完成命令的结果与shell的eval函数一起使用,例如 通过将以下内容添加到启动文件中:

eval "`pip completion --bash`"

3.pip 指令集

pip是一个命令行程序。 安装pip时,会将pip命令添加到系统中,该命令可以从命令提示符处运行,如下所示:

$ pip <pip arguments>

如果在你的环境中无法运行,可能是由于pip所在路径并没有被添加到系统的环境变量PATH中,可以通过python命令运行pip

$ python -m pip <pip arguments>

在Windows环境 py命令可以使用:

$ py -m pip <pip arguments>

3.1.帮助显示
$pip --help

如何查看子命令的帮助

pip install --help # 子命令输入后加--help,就能看相关子命令的参数
3.2. 查看当前pip版本与路径
$pip --version
$pip -V

3.3. 安装第三方库

pip 支持从PyPI、版本控制、本地项目以及发布版本多种方式安装包

  • 最常见的通过PyPI安装
$ pip install SomePackage            # 最新版本
$ pip install SomePackage==1.0.4     # 指定版本
$ pip install 'SomePackage>=1.0.4'     # 指定最低版本
  • 通过Requirements文件安装
$ pip install -r requirements.txt

从逻辑上讲,requirements.txt只是放置了pip安装参数的列表文件。

关于 requirements.txt文件的格式有时间再另行说明//TODO

3.4. 查看已经安装的第三方库

pip list
pip list --outdated:可以查看有更新的第三方库:显示当前版本,以及最新版本

3.5. 查看安装详情

pip show SomePackage

3.6 升级第三方库

$ pip install --upgrade [SomePackage,]

3.7. 卸载第三方库

pip uninstall SomePackage

3.8. 搜索包功能

在包索引中搜索对应的包,查询是模糊的

包索引猜测应该是配置中的index-url配置项,待验证。//TODO

pip search SomePackage

3.9. 导出已安装包的清单

生成一个类似的已安装包列表,但输出使用 pip install 期望的格式。

一个常见的约定是将此列表放在 requirements.txt 文件中:

pip freeze > requirements.txt

4. 卸载pip

python -m pip uninstall pip

也可以直接把pip文件夹删了;建议使用命令后把遗留的文件删除即可。

参考:

来自互联网相关资料

CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…

发布评论