egg文件是什么,与一般的包目录有什么不同?
egg是一种包格式,可以是压缩的,也可以是目录,最常用的是zip。使用egg格式有如下好处:
- 使一些工具成为可能,如包管理系统easy install;
- 安装简单,将其绝对路径加添到sys.path或PYTHONPATH即可,无需编译安装。当egg包中包含c扩展文件和非python数据文件时,会复杂些;
- 可以包含包的元数据信息,如:依赖包;
- 使得支持命名空间(namespace),这样大项目可以分为多个小的独立包,分开发布。例如zope.* 可以分成zope.a, zope.b ......布成;
- 支持运行时指定包版本,如pkg_resources的require操作。经试验,require支持多个独立的区间:require('mox<0.1, >0.4, <0.6'),mox不区分大小写;
- 支持扩展,如entry point。
当egg是一个zip压缩文件时,内部结构如下:
$ unzip -l /usr/local/lib/python2.7/dist-packages/oslo.config-1.1.0-py2.7.egg
Archive: /usr/local/lib/python2.7/dist-packages/oslo.config-1.1.0-py2.7.egg
Length Date Time Name
--------- ---------- ----- ----
560 2013-09-09 09:43 EGG-INFO/PKG-INFO
1 2013-09-09 09:43 EGG-INFO/dependency_links.txt
5 2013-09-09 09:43 EGG-INFO/top_level.txt
5 2013-09-09 09:43 EGG-INFO/namespace_packages.txt
1090 2013-09-09 09:43 EGG-INFO/SOURCES.txt
1 2013-09-09 09:43 EGG-INFO/zip-safe
219 2013-09-09 09:43 oslo/__init__.pyc
707 2013-03-12 23:33 oslo/__init__.py
139 2013-09-09 09:43 oslo/config/__init__.pyc
650 2013-03-12 23:33 oslo/config/__init__.py
68210 2013-09-09 09:43 oslo/config/cfg.pyc
61009 2013-03-12 23:33 oslo/config/cfg.py
4679 2013-09-09 09:43 oslo/config/iniparser.pyc
4246 2013-03-12 23:33 oslo/config/iniparser.py
当egg包是一个目录时,它的结构也是一样的,只是未压缩。
注意它与一般的包相比,多了一个EGG-INFO目录,这个目录就存放了该包的元数据。
egg包的使用
不要以为直接把egg包放到dist-packge中就可以import了,使用egg包有三种方法:
- 将egg包的绝对路径添加到sys.path中,这个必须在代码中执行,而且不能解决egg包依赖问题,需要手动与添加;
- 将egg包放到dist-packges(可以是sys.path中任何一目录),在代码添加如下两行,即可使用,能自动添加依赖包:
from pkg_resources import require require("FooBar>=1.2")
- 将egg包放到dist-packges(可以是sys.path中任何一目录),在easy-install.pth中添加egg包名。当python启动时,自动将该egg包及其依赖添加到sys.path中。
参考文献:
http://peak.telecommunity.com/DevCenter/PythonEggs