← Назад к вопросам

Что такое Python eggs?

2.0 Middle🔥 61 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Python eggs: история упаковки Python пакетов

Python eggs — это устаревший формат упаковки Python пакетов, предшественник современного wheel формата. Сегодня они редко используются, но важно понимать их природу для полноты знаний.

Что такое egg

Egg — это архив ZIP (с расширением .egg), содержащий Python пакет, его метаданные и зависимости. Создавались инструментом setuptools в начало-середине 2000-х годов.

# Структура egg файла
my_package-1.0.egg/
├── my_package/
│   ├── __init__.py
│   └── module.py
├── EGG-INFO/
│   ├── PKG-INFO          # Метаданные пакета
│   ├── dependency_links.txt
│   ├── entry_points.txt
│   ├── requires.txt      # Зависимости
│   └── top_level.txt
└── my_package.egg-info

# Это просто ZIP архив, можно открыть любым архиватором
unzip my_package-1.0.egg

История упаковки Python

1998-2005: Distutils  (встроенный инструмент)
  ├─ .tar.gz и .zip архивы
  └─ python setup.py install

2005-2015: setuptools + eggs (революция)
  ├─ Введены .egg архивы
  ├─ Автоматическое управление зависимостями
  ├─ easy_install инструмент
  └─ На пике популярности в 2008-2012

2012-2023: pip + wheels (текущий стандарт)
  ├─ .whl формат (ZIP с .py файлами)
  ├─ Быстрее eggs (нет распаковки)
  ├─ Лучшая совместимость
  └─ pip вытеснил easy_install

2023+: pyproject.toml + hatchling/flit
  ├─ Unified конфигурация
  ├─ Независимость от setuptools
  └─ Будущее упаковки

Как создавались eggs

# setup.py (старый подход с eggs)
from setuptools import setup, find_packages

setup(
    name='my_package',
    version='1.0.0',
    packages=find_packages(),
    install_requires=[
        'requests>=2.20.0',
        'numpy>=1.15.0',
    ],
    entry_points={
        'console_scripts': [
            'my-tool=my_package.cli:main',
        ],
    },
)

# Команды сборки
# python setup.py bdist_egg    # Создать egg
# python setup.py install      # Установить egg
# easy_install my_package      # Установить из PyPI (с egg-info)

Проблемы eggs и почему их заменили

1. Проблема с импортом

# ❌ Eggs требуют распаковки в memory
import zipimport
import sys

# Egg работает как .zip для импорта
sys.path.append('/path/to/my_package-1.0.egg')

# Это медленнее, чем прямой импорт из файлов
# Python должен распаковать egg в памяти

2. Проблема с native extensions

# ❌ Скомпилированные расширения C не работают в egg
# NumPy с версией 1.9+ не поддерживает eggs
# Нужно распаковать в директорию перед использованием

import pkg_resources
pkg_resources.require('numpy==1.8')  # Может не сработать

3. Конфликты зависимостей

# ❌ easy_install не решал dependency hell
# Если два пакета требуют разные версии libraty X
# нечего было делать

easy_install package_a  # Требует numpy==1.10
easy_install package_b  # Требует numpy==1.15
# Конфликт не разрешается!

4. Неоднозначность версионирования

# ❌ Разные версии одного пакета в одной директории
~/.python-eggs/
├── my_package-1.0.egg/
├── my_package-1.1.egg/      # Какую выбрать?
└── my_package-2.0.egg/

# Python не знал, какую версию использовать

Современная альтернатива: Wheels

Wheel — это просто ZIP файл с Python файлами, установленный как директория.

# Структура wheel файла
my_package-1.0-py3-none-any.whl
├── my_package/
│   ├── __init__.py
│   └── module.py
└── my_package-1.0.dist-info/
    ├── METADATA        # Метаданные
    ├── RECORD          # Контрольные суммы файлов
    ├── entry_points.txt
    ├── top_level.txt
    └── WHEEL           # Метаинформация wheel

# Установка wheel: просто копирование файлов
# Никакой распаковки, никакой интерпретации

Сравнение: egg vs wheel vs modern packaging

# ❌ Старый способ: egg + setuptools
setup.py с setuptools
Результат: .egg архив
easy_install для установки
Проблемы: зависимости, несовместимость, медленность

# ✅ Современный способ: wheel + pip
setup.py с setuptools + wheel
Или лучше: pyproject.toml + pip
Результат: .whl архив
pip install для установки
Преимущества: быстрота, совместимость, чистота

# ✅✅ Лучший способ: pyproject.toml + современные tools
pyproject.toml с hatchling/flit/pdm
Результат: .whl + source distribution
pip install с dependency resolution
Преимущества: стандартизация, простота, будущее

Современный setup.cfg вместо eggs

# setup.cfg (переход от setup.py)
[metadata]
name = my_package
version = 1.0.0
author = John Doe
autor_email = john@example.com
description = My awesome package
long_description = file: README.md
long_description_content_type = text/markdown

[options]
packages = find:
python_requires = >=3.8
install_requires =
    requests>=2.20
    numpy>=1.15

[options.extras_require]
dev =
    pytest>=6.0
    black>=21.0

[options.entry_points]
console_scripts =
    my-tool = my_package.cli:main

Современный pyproject.toml (лучший подход)

# pyproject.toml (актуально в 2025 году)
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "my-package"
version = "1.0.0"
description = "My awesome package"
authors = [
    {name = "John Doe", email = "john@example.com"},
]
dependencies = [
    "requests>=2.20",
    "numpy>=1.15",
]

[project.optional-dependencies]
dev = ["pytest>=6.0", "black>=21.0"]

[project.scripts]
my-tool = "my_package.cli:main"

[tool.hatch.build.targets.wheel]
packages = ["src/my_package"]

Когда ещё встречаются eggs

# 1. Очень старые пакеты (2005-2012)
# Некоторые legacy пакеты могут распространяться как eggs
# Но pip умеет их обрабатывать
pip install my_legacy_package.egg  # Сработает, но deprecated

# 2. Встроенные eggs в virtualenv старых версий
# virtualenv до 2012 года использовал eggs
# Современный venv их не использует

# 3. .egg-info директория
# Это НЕ egg файл!
# Это просто метаинформация, которая остаётся после установки пакета
# Используется pip для отслеживания установленных пакетов

import importlib.metadata
dist = importlib.metadata.distribution('requests')
print(dist.metadata)  # Читается из .egg-info или dist-info

Практический пример: миграция с eggs на wheels

# Старый способ (2010 год)
cd my_package
python setup.py bdist_egg
# Результат: dist/my_package-1.0.egg

# Новый способ (2025 год)
cd my_package
pip install build
python -m build  # Создаст wheel и source distribution
# Результат: dist/my_package-1.0-py3-none-any.whl
             dist/my_package-1.0.tar.gz

# Установка
pip install my_package-1.0-py3-none-any.whl  # Быстро
# vs
pip install my_package-1.0.egg  # Медленно и deprecated

Почему eggs были инновацией тогда, но проблемой сейчас

# 2005 год: eggs были революцией
# До eggs:
import my_module  # Где этот модуль? Неизвестно!
# После eggs: управление зависимостями!

# 2015 год: wheels вытеснили eggs
# Причины:
# 1. Wheels быстрее (нет распаковки при импорте)
# 2. Wheels проще (plain files)
# 3. Wheels поддерживают native extensions
# 4. pip лучше чем easy_install (dependency resolution)

# 2025 год: eggs — артефакт истории
# Ещё нужно знать про них для:
# - Понимания истории Python
# - Legacy maintenance
# - Interview questions :)

Итоговая таблица

ФорматПериодСозданиеУстановкаИмпортСтатус
.tar.gz1990-2005python setup.pysetup.py installos.path importDeprecated
.egg2005-2015setuptoolseasy_installZIP importDeprecated
.whl2015-2025setuptools/wheelpipPlain filesТекущий стандарт
pyproject.toml2020+hatchling/flitpipPlain filesБудущее

Вывод

Eggs — это исторический формат упаковки Python пакетов, существовавший между Distutils и современным pip/wheels. Они обеспечивали первое управление зависимостями, но были медленными и несовместимыми со скомпилированными расширениями. Сегодня wheels — это стандарт, а pyproject.toml — это будущее. Знание про eggs важно для понимания эволюции Python экосистемы, но в современной разработке ты будешь работать с wheels и pyproject.toml.

Что такое Python eggs? | PrepBro