Что такое Python wheels?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Что такое Python Wheels
Wheel (.whl) — это современный формат дистрибьюции Python пакетов, альтернатива устаревшему egg и source distributions.
Базовое определение
Wheel — это архив (ZIP), содержащий:
- Скомпилированный Python код (.pyc файлы)
- Нативные расширения (C, C++, Rust код, скомпилированный для конкретной платформы)
- Данные пакета (ресурсы, конфиги)
- Метаданные (версия, зависимости, информация об авторе)
# Структура wheel файла
my_package-1.0.0-py3-none-any.whl
├── my_package/
│ ├── __init__.py
│ ├── module.py
│ └── subpackage/
├── my_package-1.0.0.dist-info/
│ ├── WHEEL
│ ├── METADATA
│ ├── RECORD
│ └── entry_points.txt
└── (архив)
Строение имени wheel
my_package-1.0.0-py3-none-any.whl
▲ ▲ ▲ ▲
Python | | Binary
version | | compatibility
| OS (none = pure Python)
ABI tag (none = no C extensions)
Примеры:
Django-4.2.0-py3-none-any.whl— pure Python, для всех платформnumpy-1.24.0-cp311-cp311-win_amd64.whl— скомпилировано под Windows 64-bit Python 3.11cryptography-41.0.0-cp39-abi3-macosx_10_12_x86_64.whl— для macOS Intel
Сравнение с другими форматами
SDIST (Source Distribution)
├─ формат: tar.gz или zip
├─ содержит: исходный код + setup.py
├─ минусы: нужна компиляция на целевой машине
├─ плюсы: маленький размер, кроссплатформенный
└─ пример: my_package-1.0.0.tar.gz
WHEEL (Built Distribution)
├─ формат: zip архив
├─ содержит: скомпилированный код
├─ плюсы: быстрая установка, гарантированная совместимость
├─ минусы: больше размер, разные версии под платформы
└─ пример: my_package-1.0.0-py3-none-any.whl
Преимущества Wheels
1. Быстрая установка
# SDIST — копирование файлов
pip install my_package-1.0.0.tar.gz
# Нужна компиляция (может быть долго)
# WHEEL — просто распаковать архив
pip install my_package-1.0.0-py3-none-any.whl
# Почти мгновенно
2. Гарантированная совместимость
Если у тебя установлены зависимости (например, компилятор C), wheel будет работать на другой машине с тем же Python.
3. Поддержка нативных расширений
# Для пакетов с C/C++ кодом (numpy, cryptography)
# SDIST требует gcc/clang на целевой машине
# WHEEL уже скомпилирован
import numpy as np
np.dot([1, 2], [3, 4]) # Это C код, выполняется быстро
4. Кроссплатформенность (для pure Python)
Flask-3.0.0-py3-none-any.whl
▲ ▲ ▲
Python 3 no extension any platform
Этот wheel работает на Windows, macOS, Linux, везде.
Создание wheels
1. Современный способ (pyproject.toml)
# pyproject.toml
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "my-package"
version = "1.0.0"
description = "My awesome package"
# Установить инструменты
pip install build
# Собрать wheel
python -m build
# Результат: dist/my_package-1.0.0-py3-none-any.whl
2. С C расширением (setuptools)
# setup.py
from setuptools import setup, Extension
setup(
name="my_package",
ext_modules=[
Extension(
"my_package._core",
sources=["src/core.c"],
),
],
)
python -m build
# Результат: my_package-1.0.0-cp311-cp311-linux_x86_64.whl
# На других платформах/Python версиях будут разные имена
3. С Rust (с помощью maturin)
# pyproject.toml для Rust расширения
[build-system]
requires = ["maturin"]
build-backend = "maturin"
[project]
name = "my_rust_package"
maturin develop # Сборка и установка в editable mode
maturin build # Создать wheel
Установка wheels
# Из файла
pip install /path/to/my_package-1.0.0-py3-none-any.whl
# Из PyPI (pip скачивает wheel если доступен)
pip install numpy
# Скачивает numpy-1.24.0-cp311-cp311-linux_x86_64.whl
# Несколько wheels сразу
pip install *.whl
Universal wheels
Flask-3.0.0-py2.py3-none-any.whl
▲ ▲
Python 2 и 3 any platform
Универсальный wheel для Python 2 и 3. Сейчас редко, т.к. Python 2 мёртв.
Практические примеры
Пример 1: Чистый Python пакет
my_package/
├── src/
│ └── my_package/
│ ├── __init__.py
│ └── module.py
├── tests/
├── pyproject.toml
└── README.md
# Сборка
python -m build
# Результат: dist/my_package-1.0.0-py3-none-any.whl
# (один wheel для всех платформ)
Пример 2: С нативным расширением
# Linux user
python -m build
# Результат: my_package-1.0.0-cp311-cp311-linux_x86_64.whl
# Windows user (другой wheel)
python -m build
# Результат: my_package-1.0.0-cp311-cp311-win_amd64.whl
# macOS user (intel)
# Результат: my_package-1.0.0-cp311-cp311-macosx_10_9_x86_64.whl
# macOS user (apple silicon)
# Результат: my_package-1.0.0-cp311-cp311-macosx_11_0_arm64.whl
Именно поэтому на PyPI один пакет имеет множество wheels.
Binary wheels vs Source distributions
Посмотри на PyPI:
numpy 1.24.0
├── numpy-1.24.0.tar.gz (source)
├── numpy-1.24.0-cp39-*.whl (binary для Python 3.9)
├── numpy-1.24.0-cp310-*.whl (binary для Python 3.10)
├── numpy-1.24.0-cp311-*.whl (binary для Python 3.11)
├── numpy-1.24.0-cp312-*.whl (binary для Python 3.12)
└── ...
pip install numpy
# Автоматически выбирает подходящий wheel
Содержимое WHEEL файла
# Пример содержимого my_package-1.0.0.dist-info/WHEEL
Wheel-Version: 1.0
Generator: setuptools (68.0.0)
Root-Is-Purelib: true
Tag: py3-none-any
Advanced: Wheel файлы с компилятором
Для пакетов с C расширениями нужно собирать wheels для разных платформ. GitHub Actions помогает:
# .github/workflows/build-wheels.yml
name: Build Wheels
with:
- uses: PyO3/maturin-action
with:
maturin-version: latest
Где находятся wheels
- PyPI — основной источник (https://pypi.org)
- Локально — после сборки в
dist/папке - Requirements файл:
-f ./wheels/ # Поиск wheels в локальной папке
numpy==1.24.0
Итого
✅ Wheels — современный стандарт распределения Python пакетов
✅ Быстрая установка (нет компиляции на целевой машине)
✅ Поддержка нативных расширений (C, C++, Rust)
✅ Специфичные для платформы (разные для Windows/macOS/Linux)
✅ Простое создание: python -m build
В 99% случаев pip автоматически скачает и установит wheel если он доступен на PyPI.