Python 包和 egg-info 目录
有人能解释一下egg-info目录是怎么和它对应的模块关联起来的吗?比如,我有以下内容:
/usr/local/lib/python2.5/site-packages/quodlibet/
/usr/local/lib/python2.5/site-packages/quodlibet-2.0.egg-info/
我在想,egg-info目录是为了让setuptools(easy_install)能看到对应的模块,对吧?如果是这样的话,setuptools是怎么把egg-info目录和模块目录关联起来的呢?
假设我理解得没错,为了举个例子……如果我想让一个已经存在的包对setuptools可见,我是不是可以直接把模块目录和egg-info目录做个符号链接到site-packages目录?我本来想自己试试,但不太确定怎么测试这个包是否对setuptools可见。如果你能告诉我怎么测试的话,那就更好了 :)
我想搞清楚这些的主要原因是,我想把我的一些模块做符号链接到site-packages,这样我就可以修改它们,并且这些修改能被使用它们的脚本看到,而不需要在每次修改后都从PyPI重新安装这个egg。
1 个回答
.egg-info 目录只有在使用 --single-version-externally-managed 安装 egg 时才会创建。通常情况下,安装一个 egg 会生成一个单独的目录(或者一个压缩文件),里面包含代码和一些元数据(就是关于这个包的信息)。
pkg_resources 是一个用来读取这些元数据的库,它有一个叫 require
的函数,可以用来请求特定版本的包。对于“老式”的常规导入,easy_install 会修改一个 .pth 文件,把 egg 目录添加到 sys.path 中。而使用 --single-version-externally-managed 时,就不需要这种修改了,因为系统只会安装一个版本(通过系统的打包工具,比如 rpm 或 dpkg)。不过,egg-info 仍然会被包含在内,以便那些使用 require
(或者其他 pkg_resources 绑定机制)的应用可以找到它。
如果你想通过硬链接的方式安装一个包,我建议使用 "setup.py develop"。这是 setuptools 提供的一个命令,它并不会真正安装 egg,而是让它在整个系统中可用。为了做到这一点,它会创建一个 egg-link 文件,这样 pkg_resources 就能找到它,同时还会修改一个 .pth 文件,以便常规导入也能找到它。