Как Python отслеживает модули, установленные с яйцами?

Если у меня есть модуль, 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» с пустым модулем «хаха» в ней (и __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 Solutions collect form web for “Как Python отслеживает модули, установленные с яйцами?”

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

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

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

Если вы используете параметр -m easy_install для установки дистрибутива в виде нескольких версий , запись easy-install.pth для него не добавляется или удаляется, если она уже существует. Вот почему документация easy_install говорит вам использовать -m перед удалением установленного яйца.

Когда вы запускаете 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 ​​непосредственно в пакеты сайта.

  • Databricks (Spark): .gg зависимости не установлены автоматически?
  • Не удалось установить pip: ошибка отказа в разрешении
  • Большинство Pythonic способ предоставить глобальные переменные конфигурации в config.py?
  • Как включить и использовать .eggs / pkg_resources в каталоге проекта, ориентированном на python 2.5.1
  • Есть ли у меня какие-либо обязательства, если я загружу яйцо в CheeseShop?
  • Почему ошибка при установке локального хранилища яиц?
  • Я не могу найти setup.py в моей установке OSB babel для импорта файлов celr babel, что я делаю неправильно?
  • Загруженные файлы кеша Easy_install
  • В чем смысл файлов яиц Python?
  • Исключение исходных файлов из встроенного rpm-дистрибутива с помощью setuptool
  • Пакет пространства имен с tarball и яйцом в Python
  • Python - лучший язык программирования в мире.