Python如何跟踪用鸡蛋安装的模块?

时间:2010-11-29 16:11:25

标签: python module installation easy-install egg

如果我在foo中有一个模块Lib/site-packages,我可以import foo,它就可以了。但是,当我从鸡蛋中安装东西时,我会得到像blah-4.0.1-py2.7-win32.egg这样的文件夹,里面有模块内容,但我仍然需要做import foo,而不是更复杂。 Python如何跟踪鸡蛋?它不仅仅是dirname匹配,就好像我将该文件夹放入Python安装而不通过dist-utils,它找不到模块。

更清楚:我刚刚安装了zope。文件夹名称为“zope.interface-3.3.0-py2.7-win32.egg”。这有效:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import zope.interface
>>>

我创建了一个“blah-4.0.1-py2.7-win32.egg”文件夹,其中包含一个空模块“haha”(和__init__.py)。这不起作用:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import blah.haha
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named blah.haha
>>>

但确实如此:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pkg_resources import require
>>> require("blah>=1.0")
[blah 4.0.1 (c:\python27\lib\site-packages\blah-4.0.1-py2.7-win32.egg)]
>>> import haha
>>>

那么如何在没有require的情况下使其工作?

2 个答案:

答案 0 :(得分:19)

如果您使用easy_install(或其setuptools分叉)提供的Distribute脚本将程序包作为egg安装,您将看到默认情况下会创建一个文件在Python安装的easy-install.pth目录中命名为site-packagesPath configuration files是Python的标准功能:

  

路径配置文件是文件   其名称的格式为package.pth   并存在于四个中的一个中   上面提到的目录;它的   内容是附加项目(每个一个   line)将被添加到sys.path。

easy_install大量使用了这个Python功能。当您使用easy_install添加或更新分发时,它会修改easy-install.pth以添加egg目录或zip文件。通过这种方式,easy_install可以保持对模块搜索顺序的控制,并确保它安装的蛋在搜索顺序的早期出现。以下是easy-install.pth

的内容示例
import sys; sys.__plen = len(sys.path)
./appscript-0.21.1-py2.6-macosx-10.5-ppc.egg
./yolk-0.4.1-py2.6.egg
./Elixir-0.7.1-py2.6.egg
./Fabric-0.9.0-py2.6.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginse
rt',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)

正如你在这里看到的那样,如果你检查setuptools中的代码,你会发现引导自己然后覆盖它的轨道可能会导致site.py和解释器的调试问题。启动有点有趣。 (这是一些开发人员不喜欢使用它的原因之一。)

如果您使用-m的{​​{1}}参数将分发安装为多版本,则不会添加或删除easy_install条目如果它已经存在这就是easy_install documentation告诉您在删除已安装的鸡蛋之前使用easy-install.pth的原因。

答案 1 :(得分:3)

当您运行easy_install时,它会将egg复制到site-packages中,并将该路径的路径放在sys.path变量中。 (注意,sys.path不是你的PATH环境变量,它是由PYTHONPATH和其他环境变量构造的。所以你用easy_install安装的.egg文件放在一些环境变量中,python知道将它添加到sys.path中python interpreter开始)。

要让blah.haha在你的例子中工作,要么运行easy_install blah-4.0.1-py2.7-win32.egg,然后你可以从python中import haha,或者只是将haha模块直接放在site-packages中。