本文共 5304 字,大约阅读时间需要 17 分钟。
这篇文章主要介绍了Python的包管理,学习过程中主要参考官网以及自己的理解,整理成笔记以便后续自己查阅。
如果转载,请保留作者信息。 邮箱地址:jpzhang.ht@gmail.com是 python 标准库的一部分,2000年发布。提供了建立和安装额外的模块集成到一个Python安装。使用它能够进行 python 模块的安装和发布。新的模块可以是100%纯Python,或可扩展模块用C写的,也可以是Python包即Python和C编码模块的集合。
大多数Python开发者不会直接使用这个模块,而是使用由 (PyPA是一个工作组,维护许多python相关的项目)提供的跨版本的工具。特别是,,它提供的distutils增强替代。目前已经不推荐通过distutils来进行包安装,推荐pip进行安装,通过运行与setuptools所有setup.py脚本,即使包本身只引入distutils。
distutils是靠一个setup.py脚本安装,setup.py 就是利用 distutils 的功能写成,我们可以看一个简单的 的例子,在这里可以看到关于 setupt.py 格式的所有详细描述:。要安装一个模块到当前的 python 环境中,可以使用这个模块提供的 setup.py 文件.
例子:
foo |- foo.py |- setup.py |- MANIFEST :说明 |- dist:生成包 |---|- foo-1.0.tar.gz:安装包setup.py:
from distutils.core import setupsetup(name='foo', version='1.0', py_modules=['foo'], )
foo.py:代码模块 这里为空文件
下面的代码会发布一个 python 模块,将其打包成 tar.gz 或者 zip 压缩包:
python setup.py sdist
甚至能打包成 rpm 或者 exe 安装包:
python setup.py bdist_rpmpython setup.py bdist_wininst
要安装一个模块到当前的 python 环境中,可以使用这个模块提供的 setup.py 文件:
python setup.py install
关于distutils工具这里不再具体说明,可以参考官网相关信息。
是一个为了增强 distutils 而开发的集合,2004年发布。它包含了 easy_install 这个工具。它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的。用户在使用setuptools创建的包时,并不需要已安装setuptools,只要一个启动模块即可。
功能亮点: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 democd demo
在demo中创建一个setup.py文件,写入
from setuptools import setup, find_packagessetup( 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.eggdist/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 中。因此,我们可以认为它们是同一个东西。[]
Eggs 格式是 setuptools 引入的一种文件格式,它使用 .egg 扩展名,用于 Python 模块的安装。setuptools 可以识别这种格式。并解析它,安装它。“Python egg”表示一个Python项目的特定版本发布的逻辑结构,包括它的代码,资源和元数据。想要详细了解,请参考
是目前 python 包管理的事实标准,PyPI推荐工具安装Python包,2008年发布。它被用作 easy_install 的替代品,但是它仍有大量的功能建立在 setuptools 组件之上。
pip 希望不再使用 Eggs 格式(虽然它支持 Eggs),而更希望采用“源码发行版”(使用 python setup.py sdist 创建)。这可以充分利用 提供的方便功能。
pip 可以利用 requirments.txt 来实现在依赖的安装。在 setup.py 中,也存在一个 install_requires 表来指定依赖的安装。它们的区别在哪里?可以看这篇文章:
pip 支持 ,可以直接从 gz 或者 zip 压缩包安装,支持搜索包,以及指定服务器安装等等功能。
详细介绍了两者的不同,上大牛的回答。它们可以说是各占胜场,但 pip 明显优势更大。
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操作请参考
。Python内置封装格式。是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 模块。
可以用来定义 wheel 打包时候的相关信息。
详细介绍了 wheel 和 Eggs 格式的区别,很显然,wheel 优势明显,Egg包的格式是由2004的推出,而Wheel的格式是由PEP 427 2012推出,Wheel目前被认为是建立和Python二进制包装标准。
网站展示了使用 Wheels 发行的 python 模块在 PyPI 上的占有率。
被设计为 distutils 的替代品。从2009年开发到2012年。它包含更多的功能,并希望以 packaging 作为名称进入 python 3.3 成为标准库的一部分。 是 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、用 上传到PyPI分布。上面提到的大部分资料,都是在这里找到,或者是提到:Python
感谢这两篇文章,让我了解Python的包管理,然后写下此文帮助自己理解:,