原文:http://peak.telecommunity.com/DevCenter/PythonEggs
捡其重点翻译之。
Eggs概览
如果只是想以发布.egg文件的形式安装一个项目,直接看Easy Install page就可以了。EasyInstall使得安装Python代码非常简单,就运行
easy_install <project_name>
就可以了。
Eggs之于Python,正如Jar包之于Java.
Python eggs绑定了Python项目和其相关的信息,它使得可以在运行时检查和满足该项目的依赖包,并且使得该项目可以给其他项目提供插件。有几种二进制格式可以实现eggs,但是最常用和最方便的就是zip文件格式的.egg.
最简单的安装和使用Python eggs的方法就是利用EasyInstall这个Python包管理器,它可以发现、下载、编译、和安装eggs,而你所需要做的就是告诉EasyInstall你要使用的这个project的名字和版本。
可以使用setuptools包来编译制作Python eggs.
使用Eggs
如果是一个基于纯Python的.egg文件,即没有任何包内的数据文件(in-package data files),并且你也不介意手动地将此.egg文件放置到sys.path或PYTHONPATH里,那么你可以不用setuptools来安装该.egg文件。但是,对于包含了C扩展(C extensions)的eggs,或者是需要访问egg内部非Python数据文件的eggs文件,那么就需要安装setuptools里的pkg_resources模块。关于安装步骤,参见EasyInstall page.
除了对包含C扩展或数据文件的eggs提供运行时支持,pkg_resources模块也提供一个API来自动定位eggs和它们的依赖包,并在运行时将它们添加进sys.path. 由此能力,你可以同时安装和维护某个package的多个版本。
那么如何分辨“纯”Python egg和一个有C扩展的egg呢?区别就是有C扩展的egg会以它们的目标平台的名字来作为它们文件名的结尾部分(在.egg之前的部分)。而“纯”Python eggs原则上是平台无关的。pkg_resources模块能够在运行时寻找本平台上的eggs文件,而忽略那些在本平台上无法使用的eggs文件。
一旦有eggs被安装,就需要将其所依赖的eggs都放到sys.path上。一个方便的方法是–自动发现。
自动发现
首先,将所有的eggs都放到sys.path上,比如site-packages里,或者你的主程序脚本所在的目录,或者是一个将被加入到PYTHONPATH或sys.path的目录。然后,在试图从任何eggs导入(import)之前,使用下面的一段代码:
from pkg_resources import require
require("FooBar>=1.2")
以上的语句将搜索所有的sys.path路径来寻找名叫“FooBar”的egg,其version大于等于1.2,会找到最新的那个版本。
解压一个egg文件,查看EGG-INFO/depends.txt,可以看到该egg文件的依赖包的情况。
注意:pkg_resources模块不会自动在PYPI上寻找eggs,任何所需的eggs必须已经被放置在sys.path上,否则require()将抛出一个DependencyNotFound的异常。如果希望自动安装一个project所有的依赖,那么在制作这个project的时候就应当使用setuptools,使用它来声明依赖包。制作eggs也需要setuptools.
制作eggs(building eggs)
要从一个package的setup.py来制作一个egg,你需要安装setuptools.
编辑目标package的setup.py,然后添加
from setuptools import setup
以替代已经被import的setup函数。最后运行
setup.py bdist_egg
这样,一个.egg文件就会被在dist目录中制作出来。如果希望添加特别的metadata文件,可以在bdist_egg所创建的.egg-info文件夹中添加。该文件夹下的所有文件都会被拷贝到该egg文件的EGG-INFO文件夹中。其他的metadata文件会被自动生成出来,所以不用去编辑它们。
声明依赖
一些eggs依赖于另一些eggs. 然而,对于一个library来说,并不是总能找到一个合适的地方来调用require(),并且library的源代码绝不是一个声明依赖的好的地方。因此,setuptools允许在该项目的setup脚本里声明依赖情况,由此,依赖情况就会被绑定在该egg文件的metadata目录中。这样,在运行时或EasyInstall时,就可以自动找到这些所依赖的eggs,在该project被安装或者在运行时被require()时,将它们添加进sys.path.
注意,因为安全的原因,require()只会在本地的sys.path里定位依赖的eggs.