Python 包管理
Posted Mr_扛扛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 包管理相关的知识,希望对你有一定的参考价值。
一、写在前面
这篇文章主要介绍了Python的包管理,学习过程中主要参考官网以及自己的理解,整理成笔记以便后续自己查阅。
如果转载,请保留作者信息。
邮箱地址:jpzhang.ht@gmail.com
二、python 包管理工具介绍
(1)distutils:
distutils 是 python 标准库的一部分,2000年发布。提供了建立和安装额外的模块集成到一个Python安装。使用它能够进行 python 模块的安装和发布。新的模块可以是100%纯Python,或可扩展模块用C写的,也可以是Python包即Python和C编码模块的集合。
大多数Python开发者不会直接使用这个模块,而是使用由Python Packaging Authority (PyPA是一个工作组,维护许多python相关的项目)提供的跨版本的工具。特别是,setuptools,它提供的distutils增强替代。目前已经不推荐通过distutils来进行包安装,推荐pip进行安装,通过运行与setuptools所有setup.py脚本,即使包本身只引入distutils。
distutils是靠一个setup.py脚本安装,setup.py 就是利用 distutils 的功能写成,我们可以看一个简单的 setup.py 的例子,在这里可以看到关于 setupt.py 格式的所有详细描述:Writing the Setup Script。要安装一个模块到当前的 python 环境中,可以使用这个模块提供的 setup.py 文件.
例子:
foo
|- foo.py
|- setup.py
|- MANIFEST :说明
|- dist:生成包
|---|- foo-1.0.tar.gz:安装包
setup.py:
from distutils.core import setup
setup(name='foo',
version='1.0',
py_modules=['foo'],
)
foo.py:代码模块 这里为空文件
下面的代码会发布一个 python 模块,将其打包成 tar.gz 或者 zip 压缩包:
python setup.py sdist
甚至能打包成 rpm 或者 exe 安装包:
python setup.py bdist_rpm
python setup.py bdist_wininst
要安装一个模块到当前的 python 环境中,可以使用这个模块提供的 setup.py 文件:
python setup.py install
关于distutils工具这里不再具体说明,可以参考官网相关信息。
(2)setuptools 和 distribute
setuptools 是一个为了增强 distutils 而开发的集合,2004年发布。它包含了 easy_install 这个工具。它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的。用户在使用setuptools创建的包时,并不需要已安装setuptools,只要一个启动模块即可。
功能亮点:
- 利用EasyInstall自动查找、下载、安装、升级依赖包
- 创建Python Eggs
- 包含包目录内的数据文件
- 自动包含包目录内的所有的包,而不用在setup.py中列举
- 自动包含包内和发布有关的所有相关文件,而不用创建一个MANIFEST.in文件
- 自动生成经过包装的脚本或Windows执行文件
- 支持Pyrex,即在可以setup.py中列出.pyx文件,而最终用户无须安装Pyrex
- 支持上传到PyPI
- 可以部署开发模式,使项目在sys.path中
- 用新命令或setup()参数扩展distutils,为多个项目发布/重用扩展
- 在项目setup()中简单声明entry points,创建可以自动发现扩展的应用和框架
ez_setup.py 是 setuptools 的安装工具。ez 就是 easy 的缩写。简单的说,setuptools 是一个项目的名称,是基础组件。而 easy_install 是这个项目中提供的工具,它依赖基础组件工作。使用 setuptools 可以自动 下载、构建、安装和管理 python 模块。
Ubuntu 系统上最简单安装:
sudo apt-get install python-setuptools
脚本手动安装:
下载ez_setup.py和使用目标Python版本运行。该脚本将下载相应版本并安装:
wget https://bootstrap.pypa.io/ez_setup.py -O - | python
举个例子,创建一个包:
建立目录
cd /tmp
mkdir demo
cd demo
在demo中创建一个setup.py文件,写入
from setuptools import setup, find_packages
setup(
name = "demo",
version = "0.1",
packages = find_packages(),
)
执行python setup.py bdist_egg
demo
|– build
| – bdist.linux-x86_64
|– demo.egg-info
| |– dependency_links.txt
| |– PKG-INFO
| |– SOURCES.txt
| – top_level.txt
|– dist
| – demo-0.1-py2.7.egg
– setup.py
在dist中生成的是egg包
file dist/demo-0.1-py2.7.egg
dist/demo-0.1-py2.7.egg: Zip archive data, at least v2.0 to extract
这里具体不再详细阐述参考官网
从 PyPI 上安装一个包(按名称搜索PyPI上安装包,最新的版本,并自动下载和安装):
easy_install SQLObject
下载一个包文件,然后安装它参考,安装或升级包的名称和版本,找到一个给定的“下载页面”的链接
easy_install -f http://pythonpaste.org/package_index.html SQLObject
从指定的网址下载源,自动构建和安装
easy_install http://example.com/path/to/MyPackage-1.2.3.tgz
安装已下载的.egg 格式包:
easy_install /my_downloads/OtherPackage-3.2.1-py2.3.egg
升级已安装的软件包,在PyPI上的最新版本
easy_install --upgrade PyProtocols
更多信息请参考官网
distribute 是 setuptools 的一个分支版本。分支的原因可能是有一部分开发者认为 setuptools 开发太慢了。但现在,distribute 又合并回了 setuptools 中。因此,我们可以认为它们是同一个东西。[参考]
(3) Eggs
Eggs 格式是 setuptools 引入的一种文件格式,它使用 .egg 扩展名,用于 Python 模块的安装。setuptools 可以识别这种格式。并解析它,安装它。“Python egg”表示一个Python项目的特定版本发布的逻辑结构,包括它的代码,资源和元数据。想要详细了解,请参考The Quick Guide to Python Eggs
(4) pip
pip 是目前 python 包管理的事实标准,PyPI推荐工具安装Python包,2008年发布。它被用作 easy_install 的替代品,但是它仍有大量的功能建立在 setuptools 组件之上。
pip 希望不再使用 Eggs 格式(虽然它支持 Eggs),而更希望采用“源码发行版”(使用 python setup.py sdist 创建)。这可以充分利用 Requirements File Format 提供的方便功能。
pip 可以利用 requirments.txt 来实现在依赖的安装。在 setup.py 中,也存在一个 install_requires 表来指定依赖的安装。它们的区别在哪里?可以看这篇文章:setup.py vs requirements.txt
pip 支持 git/svn/hg 等流行的 VCS 系统,可以直接从 gz 或者 zip 压缩包安装,支持搜索包,以及指定服务器安装等等功能。
pip vs easy_install详细介绍了两者的不同,stackoverflow上大牛的回答。它们可以说是各占胜场,但 pip 明显优势更大。
- pip 能够安装 wheels 包, easy_install不能处理。
- virtualenv虚拟环境已成为一个非常重要的工具,但不能基于easy_install正常工作。
- distribute包含的easy_install不再保留。setuptools来代替。
- ……
pip并没有随着Python一起安装,因此我们需要先安装它。Linux下,一般这样安装:
$ sudo apt-get install python-pip
在安装任何其他包之前,我总是通过PyPI将pip升级到最新版本的, Ubuntu软件库中的版本普遍落后的PyPI。我通过pip升级pip它自己。
$ sudo pip install pip --upgrade
现在如果需要安装任何包,你可以运行 pip install package-name 命令。 所以可以通过下面命令安装 simplejson:
$ sudo pip install simplejson
删除包也很简单。
$ sudo pip uninstall simplejson
一般情况下, pip 会从PyPI自动安装最新的稳定版, 但有时我们需要安装一个特定版本的包,因为你的项目可能基于特殊的版本。 因此你可能需要使用类似如下的 pip install 命令:
$ sudo pip install simplejson==2.2.1
我们可能需要升级/降级/重新安装包。此时可以通过下面的命令完成:
$ sudo pip install simplejson --upgrade
$ sudo pip install simplejson==2.2.1 --upgrade
更多关于pip操作请参考
https://pip.pypa.io/en/latest/reference/pip_install/#pip-install-examples。
(5) wheel
Python内置封装格式。wheel是Python发行新的标准,旨在代替Egg。支持PIP > = 1.4 > = 0.8提供的工具包。本质上是一个 zip 包格式,它使用 .whl 扩展名,用于 python 模块的安装,它的出现是为了替代 Eggs。
Wheel的优点:
* 纯Python和原生的C扩展包安装速度更快
* 避免执行任意代码进行安装(避免setup.py)
* C扩展的安装不需要在Windows或OS X的编译器
* 允许更好的缓存进行测试和持续集成
* 创建.pyc文件在安装过程中,以确保他们所使用的Python解释器相匹配
* 更一致的跨平台和机器安装
wheel 还提供了一个 bdist_wheel 作为 setuptools 的扩展命令,这个命令可以用来生成 wheel 包。
pip 提供了一个 wheel 子命令来安装 wheel 包。当然,需要先安装 wheel 模块。
setup.cfg 可以用来定义 wheel 打包时候的相关信息。
Wheel vs Egg 详细介绍了 wheel 和 Eggs 格式的区别,很显然,wheel 优势明显,Egg包的格式是由2004的推出,而Wheel的格式是由PEP 427 2012推出,Wheel目前被认为是建立和Python二进制包装标准。
Python Wheels 网站展示了使用 Wheels 发行的 python 模块在 PyPI 上的占有率。
(6) distutils2 和 distlib
distutils2 被设计为 distutils 的替代品。从2009年开发到2012年。它包含更多的功能,并希望以 packaging 作为名称进入 python 3.3 成为标准库的一部分。distlib 是 distutils2 的部分,它为 distutils2/packaging 提供的低级功能增加高级 API,使其便于使用。目前已经停止开发,不推荐使用。这里介绍了 distlib 没有进入 python 3.3 标准库的一些原因。
三、工具选择
安装工具建议:
1、使用pip从PyPI上安装Python包。根据pip安装,你也可能需要安装wheel,使用wheel缓存的好处。
2、使用virtualenv或pyvenv,从一个共享的Python安装环境,隔离应用程序特定的依赖关系。
打包工具推荐:
1、使用setuptools定义项目,并创建源代码分发。
2、使用可用的bdist_wheel setuptools的扩展从wheel项目创造wheel。这是特别有益的,如果您的项目包含二进制扩展。
3、用twine 上传到PyPI分布。
四、引用
上面提到的大部分资料,都是在这里找到,或者是提到:Python Python Packaging User Guide
感谢这两篇文章,让我了解Python的包管理,然后写下此文帮助自己理解:Differences between distribute, distutils, setuptools and distutils2? ,
zrong’s blog
以上是关于Python 包管理的主要内容,如果未能解决你的问题,请参考以下文章