В чем разница между дистрибутивом 'sdist' .tar.gz и яйцом питона? - PullRequest
29 голосов
/ 09 июня 2011

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

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

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

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

Ответы [ 2 ]

32 голосов
/ 09 июня 2011

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

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

13 голосов
/ 09 июня 2011

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

$ python setup.py --help-commands

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

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

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

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

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

...