В чем разница между дистрибутивом sdist.tar.gz и яйцом питона?

Я немного смущен. Похоже, есть два разных типа пакетов Python: исходные дистрибутивы (setup.py sdist) и яичные (setup.py bdist_egg).

Оба, похоже, просто архивы с одинаковыми данными, исходные файлы python. Одно отличие состоит в том, что pip, самый рекомендуемый менеджер пакетов, не может устанавливать яйца.

В чем разница между этими двумя и как "распространять" мои пакеты?

(Обратите внимание, я не хочу распространять свои пакеты через PyPI, но я хочу использовать менеджер пакетов, который выбирает мои зависимости из PyPI)

2 ответа

Решение

setup.py sdist создает исходный дистрибутив: он содержит setup.py, исходные файлы вашего модуля / скрипта (.py файлы или.c /.cpp для бинарных модулей), ваши файлы данных и т. д. В результате получается архив, который затем можно использовать перекомпилировать все на любой платформе.

setup.py bdist (а также bdist_*) создает встроенный дистрибутив: он включает файлы.pyc,.so /.dll /.dylib для бинарных модулей, .exe при использовании py2exe в Windows ваши файлы данных... но не setup.py. Результатом является архив, специфичный для платформы (например, linux-x86_64) и на версию Python, и ее можно установить, просто распаковав в корневой каталог вашей файловой системы (исполняемые файлы находятся в /usr/bin (или эквивалентном), файлы данных в / usr / share, модули в /usr/lib/pythonX.X/site-packages/...). Вы даже можете создавать rpm-архивы, которые можно установить напрямую с помощью вашего менеджера пакетов.

Существует много более двух различных типов пакетов Python (дистрибутив). Эта команда перечисляет много подкоманд:

$ python setup.py --help-commands

Обратите внимание на различные типы BDIST.

Яйцо было новым типом упаковки, введенным setuptools, но позже принятым стандартной библиотекой. Он предназначен для установки на монолитный sys.path, Это отличается от пакета sdist, который должен иметь setup.py install запустить, скопировать каждый файл на место и, возможно, предпринять другие действия (сборка модулей расширения, запуск дополнительного произвольного кода Python, включенного в пакет).

яйца в значительной степени устарели на данный момент. В настоящее время предпочтительным форматом упаковки является формат "колеса".

Создаете ли вы sdist или egg (или wheel), не зависит от того, сможете ли вы объявить, какие зависимости у пакета (для автоматической загрузки во время установки PyPI). Все, что необходимо для работы этой функции зависимостей, это чтобы вы объявили зависимости, используя дополнительные API, предоставляемые дистрибутивом (преемником setuptools) или distutils2 (преемником distutils - иначе называемым упаковкой в текущей версии разработки Python 3). Икс).

https://packaging.python.org/ - хороший ресурс для получения дополнительной информации об упаковке. Он охватывает некоторые особенности объявления зависимостей (например, install_requires, но не extras_require AFAICT).

Другие вопросы по тегам