如果我在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
的情况下使其工作?
答案 0 :(得分:19)
如果您使用easy_install
(或其setuptools
分叉)提供的Distribute
脚本将程序包作为egg安装,您将看到默认情况下会创建一个文件在Python安装的easy-install.pth
目录中命名为site-packages
。 Path 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中。