2010-11-29 55 views
11

如果我有一個模塊,foo,在Lib/site-packages,我可以只是import foo,它會工作。然而,當我從雞蛋中安裝東西時,我會得到類似blah-4.0.1-py2.7-win32.egg的文件夾,裏面有模塊內容,但我仍然只需要做import foo,而不是更復雜。 Python如何跟蹤雞蛋?這不僅僅是dirname匹配,如果我沒有通過dist-utils將該文件夾放到Python安裝中,它不會找到該模塊。Python如何跟蹤安裝了雞蛋的模塊?

更清晰:我剛安裝了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 
>>> 

我創建了一個 「嗒嗒-4.0.1-py2.7-win32.egg」 文件夾中的一個空模塊 「哈哈」(和__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

Python源代碼完全爲您提供。你可以閱讀`import`語句的實現,而不會有太多的麻煩。正如他們所說:「使用源泉,盧克。」 – 2010-11-29 16:33:54

回答

18

如果您使用setuptools提供的easy_install腳本(或Distribute叉的話)來安裝軟件包如雞蛋,你會看到,默認情況下,它會創建一個在site-packages目錄Python安裝的命名easy-install.pth文件。 Path configuration files是Python中的標準特性:

路徑配置文件是一個文件 ,其名稱的形式爲package.pth 並且存在於上面提到的四個 目錄之一;其 內容是添加到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和解釋器啓動有趣調試問題。 (這是一些開發人員不喜歡使用它的原因之一。)

如果您使用的easy_install-m參數安裝一個分發多版本,在easy-install.pth條目它不添加或如果它已經存在被刪除。這就是爲什麼easy_install documentation告訴你在刪除安裝的蛋之前使用-m

3

當你運行easy_install時,它將雞蛋複製到站點包中,並將該雞蛋的路徑放到你的sys.path變量中。 (請注意,sys.path不是您的PATH環境變量,它是由PYTHONPATH和其他環境變量構建的。因此,使用easy_install安裝的.egg文件會被放入某個環境變量中,並且python知道將它添加到sys.path中python解釋器啓動)。

爲了讓blah.haha在你的例子中工作,可以運行easy_install blah-4.0.1-py2.7-win32.egg,然後你可以在python中使用import haha,或者直接把haha模塊直接放在site-packages中。