Python egg与常规包有什么不同?
看起来,只要把一个包的路径加到你的PYTHONPATH里,就能访问它的所有模块和函数,这和安装一个egg包差不多。那它们之间的区别只是egg是压缩成zip格式的吗?
4 个回答
是的,当你引用zip格式的egg文件时,它们会被即时解压,这样会比你安装后使用要慢一些。
Python Eggs 是一个用来分发软件包的系统,它的功能远不止简单地复制文件和修改 $PYTHONPATH
。
编辑:这里的 远不止
指的是,比如说 运行时依赖关系的解决 和 插件支持。更多信息可以查看 http://en.wikipedia.org/wiki/EasyInstall。
当然可以,不过还有一些细节需要了解。你可以看看这个链接:http://www.ibm.com/developerworks/library/l-cppeak3.html,去找“关于 eggs 的一切”这一部分。
从上面的网站复制过来:
不过,修改 PYTHONPATH(或者在脚本或 Python 交互式环境中修改 sys.path)这种做法有点脆弱。处理 eggs 的发现,最好是通过一些新的魔法 .pth 文件来完成。在 site-packages/ 目录下或者 PYTHONPATH 中找到的任何 .pth 文件,都会被解析以进行额外的导入,这个过程和检查那些可能包含包的目录的方式非常相似。如果你使用 setuptools 来管理包,那么在安装、升级或删除包时,会修改一个叫做 easy-install.pth 的文件。不过,你可以随意命名你的 .pth 文件,只要它们有 .pth 的扩展名就行。例如,这是我的 easy-install.pth:
列表 11. .pth 文件作为 egg 位置的配置
% cat /sw/lib/python2.4/site-packages/easy-install.pth import sys; sys.__plen = len(sys.path) setuptools-0.6b1-py2.4.egg SQLObject-0.7.0-py2.4.egg FormEncode-0.5.1-py2.4.egg Gnosis_Utils-1.2.1-py2.4.egg import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
这个格式有点特别:它几乎是一个 Python 脚本,但又不完全是。简单来说,你可以在里面添加更多的 eggs;更好的是,当 easy_install 运行时,它会为你自动处理这些。你也可以在 site-packages/ 下创建任意数量的其他 .pth 文件,每个文件可以简单列出要提供的 eggs。