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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值