2010-11-29 1 views
11

Если у меня есть модуль, foo, в Lib/site-packages, я могу только import foo, и он будет работать. Однако, когда я устанавливаю вещи из яиц, я получаю что-то вроде blah-4.0.1-py2.7-win32.egg в виде папки с содержимым модуля внутри, но мне все еще нужно только import foo, а не что-то более сложное. Как Python отслеживает яйца? Это не просто сопоставление dirname, как если бы я отбрасывал эту папку в установку Python, не переходя через dist-utils, она не находит модуль.Как 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

Если вы используете easy_install скрипт предоставленного setuptools (или Distribute вилку его) для установки пакетов, как яйца, вы увидите, что, по умолчанию, он создает файл с именем easy-install.pth в site-packages каталоге вашей установки Python. Path configuration files являются стандартной особенностью Python:

Файл конфигурации пути файл , имя которого имеет вид package.pth и существует в одном из четырех каталогов, указанных выше; его содержимое являются дополнительными элементами (по одному на строку ), которые необходимо добавить в sys.path.

easy_install сильно использует эту функцию Python. Когда вы добавляете или обновляете дистрибутив, вы используете easy_install, он изменяет easy-install.pth, чтобы добавить каталог яиц или почтовый файл. Таким образом, 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 и других переменных среды. Таким образом, файл .egg, который вы устанавливаете с помощью easy_install, помещается в некоторую переменную среды, и python знает, чтобы добавить его в sys.path, когда запущен интерпретатор python).

Чтобы получить blah.haha для работы в вашем примере, запустите easy_install blah-4.0.1-py2.7-win32.egg, а затем вы можете import haha изнутри python или просто поместить модуль haha ​​непосредственно в пакеты сайта.

 Смежные вопросы

  • Нет связанных вопросов^_^