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