Как распространять / получать доступ к файлам данных в яйце Python? - PullRequest
3 голосов
/ 15 ноября 2011

Я пишу приложение Django, которое использует pip & virtualenv для управления своей средой разработки.

Одна из зависимостей, pkgme ​​, поставляется со многими файлами данных, которые являются ее "backends "и настраиваются в его файле setup.py с помощью data_files=$FOO (а не package_data).

Когда pkgme ​​ищет свои backends, он ищет в os.path.join(sys.prefix, "share", "pkgme", "backends").Это прекрасно работает, когда pkgme ​​установлен нормально, и, кажется, соответствует документации , но не работает, когда pkgme ​​установлен как яйцо.

Там данныефайлы устанавливаются в $VIRTUAL_ENV/lib/python2.7/site-packages/pkgme-0.1-py2.7.egg/share, а не в ожидаемый $VIRTUAL_ENV/share.

, что оставляет мне два вопроса:

  1. Должен ли я использовать что-то отличное от os.path.join выше длянайти файлы данных независимо от того, используем ли мы установку на яйца или традиционную установку системы?Если да, то что?
  2. Должен ли я распространять свои файлы данных по-другому, чтобы сделать их более доступными в яйце?

Обратите внимание, что я знаю о pkgutil.get_data, нопредпочел бы не использовать его.Меня не интересует содержимое этих файлов данных, я хочу знать вместо них местоположение , чтобы я мог их выполнить.

Мой текущий план состоит в том, чтобысделать это:

  • Использовать package_data вместо data_files
  • Измените pkgme, чтобы искать бэкэнды относительно pkgme.__file__ вместо sys.prefix

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Я закончил тем, что сделал следующее:

  • Изменение pkgme ​​для использования pkg_resources.resource_filename() для поиска собственных включенных бэкэндов
  • Добавлена ​​точка входа, которую может использовать любой бэкэнд, написанный на Pythonпубликовать расположение своих собственных скриптов бэкэнда
  • Сохраняет проверку на основе sys.prefix для любого бэкэнда, который не хочет использовать Python

Дифференциал можно найти здесь:http://bazaar.launchpad.net/~pkgme-committers/pkgme/trunk/revision/86

1 голос
/ 16 ноября 2011

Ваш текущий план по существу верен или, во всяком случае, является работоспособным вариантом.

Когда setuptools создает яйцо, он проверяет, использует ли код в яйце __file__, и если да, топомечает яйцо как не подлежащее установке в сжатом виде.Таким образом, когда яйцо установлено с помощью easy_install, оно будет извлечено в каталог .egg/ вместо того, чтобы оставаться в файле .egg.

Если вы хотите поддерживать сжатый / выпадающийустановка (т. е. просто выгрузка яйца в каталог без его «установки»), тогда вы должны использовать pkg_resources.resource_filename() (документы здесь) API вместо __file__, но тогда ваш пакет будет зависетьв setuptools или распространите, чтобы этот API был доступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...