Изчерпателен наръчник за формата за разпространение Wheel и създаване на двоични пакети за Python, гарантиращ ефикасно и надеждно разпространение на софтуер.
Формат за разпространение Wheel: Създаване на двоични пакети за Python
Екосистемата на Python разчита в голяма степен на ефикасното управление на пакети. Един от крайъгълните камъни на тази екосистема е форматът за разпространение Wheel, често идентифициран с разширението .whl
. Това ръководство се задълбочава в тънкостите на формата Wheel, неговите предимства и как да създавате двоични пакети за Python, обслужвайки разработчици в световен мащаб, които се стремят към гладко и надеждно разпространение на софтуер.
Какво е форматът Wheel?
Форматът Wheel е формат за предварително изградени пакети за Python. Той е проектиран да бъде по-лесен за инсталиране от дистрибуциите на изходния код (sdist). Служи като заместител на по-стария формат egg, като отстранява няколко от неговите недостатъци. По същество това е ZIP архив със специфична структура и метаданни, които позволяват на pip
и други инструменти за инсталиране бързо да инсталират пакета, без да е необходимо да го изграждат от изходния код.
Основни характеристики на Wheel
- Независимост от платформата (където е приложимо): Wheels могат да бъдат създадени за конкретни платформи и архитектури (напр. Windows 64-bit, Linux x86_64) или да бъдат независими от платформата (чист Python). Това позволява създаването на оптимизирани двоични файлове за различни операционни системи.
- Лесна инсталация: Форматът Wheel включва предварително изградени дистрибуции, минимизирайки необходимостта от компилиране на код по време на инсталацията. Това значително ускорява процеса на инсталиране, особено за пакети с C разширения или други компилирани компоненти.
- Включване на метаданни: Wheels съдържат всички необходими метаданни за пакета, включително зависимости, информация за версията и входни точки. Тези метаданни са от решаващо значение за мениджърите на пакети като
pip
, за да обработват зависимостите и да инсталират пакета правилно. - Атомарна инсталация:
pip
инсталира пакети от Wheels по атомарен начин. Това означава, че инсталацията или завършва успешно, или се връща напълно, предотвратявайки частично инсталирани пакети, което може да доведе до несъответствия. - Възпроизводимост: Wheels подобряват възпроизводимостта, като предоставят постоянен артефакт за изграждане, който може да бъде инсталиран в множество среди, без да се изисква повторно компилиране (ако целевата платформа съвпада).
Защо да използвате Wheels?
Изборът на Wheels пред дистрибуциите на изходния код предлага множество предимства, рационализирайки процеса на инсталиране и внедряване на пакети. Ето разбивка на основните предимства:
По-бързо време за инсталиране
Едно от най-значимите предимства на Wheels е тяхната скорост. Предоставяйки предварително изградени дистрибуции, Wheels елиминират необходимостта от компилиране на код по време на инсталацията. Това е особено полезно за пакети с компилирани разширения, написани на C, C++ или други езици. Представете си внедряването на сложна научна библиотека; използването на Wheel драстично намалява времето за настройка на машините на крайните потребители.
Пример: Инсталирането на numpy
от изходния код може да отнеме няколко минути, особено на по-стар хардуер. Инсталирането от Wheel обикновено отнема секунди.
Намалена зависимост от инструменти за изграждане
Инсталирането на пакети от изходния код често изисква потребителите да имат необходимите инструменти за изграждане (компилатори, хедъри и т.н.), инсталирани на тяхната система. Това може да бъде пречка за навлизане, особено за потребители, които не са запознати с разработката на софтуер. Wheels премахват тази зависимост, което прави инсталацията по-проста и по-достъпна.
Пример: Учен по данни в изследователска лаборатория може да няма необходимите компилатори, за да създаде пакет от изходния код. Wheel им позволява да инсталират пакета директно, без да е необходимо да конфигурират своята среда.
Подобрена надеждност
Предоставяйки предварително изградени двоични файлове, Wheels гарантират, че пакетът е инсталиран по последователен начин в различни среди. Това намалява риска от грешки при инсталиране поради разлики в системните конфигурации или версиите на инструментите за изграждане. Тази последователност е от първостепенно значение за приложения, които изискват стабилно и предвидимо поведение.
Пример: Уеб приложение, разположено на множество сървъри, трябва да има последователни версии на пакетите. Използването на Wheels гарантира, че едни и същи двоични файлове са инсталирани на всеки сървър, минимизирайки риска от проблеми при внедряване.
Подобрена сигурност
Wheels могат да бъдат подписани, за да се провери тяхната автентичност и цялост. Това помага да се предотврати разпространението на подправени пакети от злонамерени участници. Подписването на пакети осигурява допълнителен слой защита, гарантирайки, че потребителите инсталират надежден софтуер.
Пример: Организациите могат да прилагат политики, които изискват всички пакети да бъдат подписани, преди да бъдат внедрени в производствени среди. Това предпазва от атаки на веригата за доставки, при които злонамерен код се инжектира в пакети.
Създаване на Wheel пакети: Ръководство стъпка по стъпка
Създаването на Wheel пакети е прост процес, който включва използването на пакетите setuptools
и wheel
. Ето подробно ръководство:
1. Настройване на вашия проект
Първо, уверете се, че вашият проект е правилно структуриран. Като минимум ще ви трябва файл setup.py
и изходният код на вашия пакет.
Пример за структура на проекта:
my_package/ ├── my_module/ │ ├── __init__.py │ └── my_function.py ├── setup.py └── README.md
2. Файлът setup.py
Файлът setup.py
е сърцето на вашия проект. Той съдържа метаданните за вашия пакет и определя как трябва да бъде изграден и инсталиран. Ето пример за файл setup.py
:
from setuptools import setup, find_packages setup( name='my_package', version='0.1.0', description='A simple example package', long_description=open('README.md').read(), long_description_content_type='text/markdown', url='https://github.com/your_username/my_package', author='Your Name', author_email='your.email@example.com', license='MIT', packages=find_packages(), install_requires=['requests'], classifiers=[ 'Development Status :: 3 - Alpha', 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', ], )
Обяснение на ключовите полета:
name
: Името на вашия пакет. Това е името, което потребителите ще използват, за да инсталират вашия пакет (напр.pip install my_package
).version
: Номерът на версията на вашия пакет. Следвайте семантичното номериране на версиите (SemVer) за последователни практики за номериране на версиите (напр.0.1.0
,1.0.0
,2.5.1
).description
: Кратко описание на вашия пакет.long_description
: Подробно описание на вашия пакет. Това често се чете от файлREADME.md
.url
: URL адресът на началната страница или хранилището на вашия пакет.author
: Името на автора на пакета.author_email
: Имейл адресът на автора на пакета.license
: Лицензът, под който се разпространява вашият пакет (напр. MIT, Apache 2.0, GPL).packages
: Списък с пакети, които да бъдат включени във вашата дистрибуция.find_packages()
автоматично намира всички пакети във вашия проект.install_requires
: Списък със зависимости, които вашият пакет изисква.pip
автоматично ще инсталира тези зависимости, когато вашият пакет е инсталиран.classifiers
: Метаданни, които помагат на потребителите да намерят вашия пакет в PyPI (Python Package Index). Тези класификатори описват състоянието на разработка, целевата аудитория, лиценза и поддържаните версии на Python.
3. Инсталиране на wheel
Ако нямате инсталиран пакета wheel
, можете да го инсталирате с помощта на pip
:
pip install wheel
4. Създаване на Wheel пакет
Навигирайте до главната директория на вашия проект (където се намира setup.py
) и изпълнете следната команда:
python setup.py bdist_wheel
Тази команда ще създаде директория dist
, съдържаща Wheel пакета (.whl
файл) и дистрибуция на изходния код (.tar.gz
файл).
5. Намиране на Wheel файла
Генерираният Wheel файл ще се намира в директорията dist
. Името му ще следва формата package_name-version-pyXX-none-any.whl
, където:
package_name
: Името на вашия пакет.version
: Номерът на версията на вашия пакет.pyXX
: Версията на Python, с която пакетът е съвместим (напр.py37
за Python 3.7).none
: Показва, че пакетът не е специфичен за платформата.any
: Показва, че пакетът е съвместим с всяка архитектура.
За wheels, специфични за платформата, таговете none
и any
ще бъдат заменени с идентификатори на платформата и архитектурата (напр. win_amd64
за Windows 64-bit).
6. Тестване на Wheel пакета
Преди да разпространите вашия Wheel пакет, е важно да го тествате, за да се уверите, че се инсталира правилно. Можете да направите това с помощта на pip
:
pip install dist/my_package-0.1.0-py39-none-any.whl
Заменете dist/my_package-0.1.0-py39-none-any.whl
с действителния път до вашия Wheel файл.
7. Разпространение на вашия Wheel пакет
След като сте създали и тествали вашия Wheel пакет, можете да го разпространите чрез различни канали:
- PyPI (Python Package Index): Най-често срещаният начин за разпространение на Python пакети. Можете да качите вашия Wheel пакет в PyPI с помощта на
twine
. - Частен индекс на пакети: За вътрешна употреба в рамките на организация можете да настроите частен индекс на пакети с помощта на инструменти като
devpi
или Artifactory. - Директно разпространение: Можете също така да разпространявате вашия Wheel пакет директно на потребителите чрез имейл, споделяне на файлове или други средства.
Работа с C разширения и Wheels, специфични за платформата
Създаването на Wheels, специфични за платформата, особено тези, съдържащи C разширения, изисква допълнителни стъпки. Ето преглед на процеса:
1. Компилиране на C разширения
C разширенията трябва да бъдат компилирани за всяка целева платформа. Това обикновено включва използването на C компилатор (напр. GCC, MSVC) и инструменти за изграждане, специфични за платформата.
Пример: В Windows ще трябва да използвате компилатора Microsoft Visual C++, за да създадете C разширения. В Linux обикновено ще използвате GCC.
2. Използване на cffi
или Cython
Инструменти като cffi
и Cython
могат да опростят процеса на създаване на C разширения. cffi
ви позволява да извиквате C код директно от Python, без да пишете C код сами, докато Cython
ви позволява да пишете C-подобен код, който е компилиран в C разширения.
3. Определяне на зависимости, специфични за платформата
Във вашия файл setup.py
можете да дефинирате зависимости, специфични за платформата, с помощта на параметрите setup_requires
и install_requires
. Това ви позволява да посочите различни зависимости за различни платформи.
Пример:
from setuptools import setup, Extension import platform if platform.system() == 'Windows': extra_compile_args = ['/O2', '/EHsc'] else: extra_compile_args = ['-O3'] setup( name='my_package', version='0.1.0', ext_modules=[ Extension( 'my_package.my_extension', ['my_package/my_extension.c'], extra_compile_args=extra_compile_args, ), ], )
4. Създаване на Wheels, специфични за платформата
За да създадете Wheels, специфични за платформата, ще трябва да използвате подходящата среда за изграждане за всяка целева платформа. Това може да включва използването на виртуални машини или технологии за контейнеризация като Docker.
Пример: За да създадете Wheel за Windows 64-bit, ще трябва да изпълните процеса на изграждане на система Windows 64-bit с инсталиран компилатор Microsoft Visual C++.
Най-добри практики за създаване на Wheel пакети
Следването на най-добрите практики гарантира, че вашите Wheel пакети са надеждни, лесни за поддръжка и лесни за използване. Ето някои ключови препоръки:
1. Използвайте семантично номериране на версиите (SemVer)
Следвайте семантичното номериране на версиите (SemVer) за последователни практики за номериране на версиите. SemVer използва трикомпонентен номер на версията (MAJOR.MINOR.PATCH
), за да покаже типа на промените във всяка версия.
- MAJOR: Показва несъвместими промени в API.
- MINOR: Показва нови функции, които са обратно съвместими.
- PATCH: Показва корекции на грешки, които са обратно съвместими.
Пример: Промяната на параметрите на функция по начин, който нарушава съществуващия код, ще изисква увеличаване на основната версия (напр. от 1.0.0 до 2.0.0). Добавянето на нова функция, без да се променят съществуващите, ще изисква увеличаване на второстепенната версия (напр. от 1.0.0 до 1.1.0). Коригирането на грешка ще изисква увеличаване на версията на кръпката (напр. от 1.0.0 до 1.0.1).
2. Включете файл README.md
Включете файл README.md
, който предоставя подробно описание на вашия пакет, включително инструкции за инсталиране, примери за употреба и указания за принос. Това помага на потребителите да разберат как да използват вашия пакет и насърчава приноса.
3. Напишете ясна и стегната документация
Напишете ясна и стегната документация за вашия пакет, включително API документация, уроци и примери. Използвайте инструменти като Sphinx или Read the Docs, за да генерирате документация от вашите кодови коментари.
4. Използвайте лиценз
Изберете лиценз за вашия пакет, който ясно определя условията, при които може да се използва, модифицира и разпространява. Общите лицензи включват MIT, Apache 2.0 и GPL.
5. Тествайте вашия пакет старателно
Тествайте вашия пакет старателно, като използвате автоматизирани инструменти за тестване като pytest
или unittest
. Напишете модулни тестове, интеграционни тестове и тестове от край до край, за да се уверите, че вашият пакет работи правилно в различни сценарии.
6. Използвайте непрекъсната интеграция (CI)
Използвайте инструменти за непрекъсната интеграция (CI) като GitHub Actions, GitLab CI или Jenkins, за да изграждате и тествате автоматично вашия пакет всеки път, когато се правят промени в кодовата база. Това помага да се хванат грешки рано и гарантира, че вашият пакет е винаги в работещо състояние.
7. Подпишете вашите пакети
Подпишете вашите пакети, за да проверите тяхната автентичност и цялост. Това помага да се предотврати разпространението на подправени пакети от злонамерени участници. Използвайте инструменти като gpg
или keyring
, за да подпишете вашите пакети.
Разширени Wheel техники
За по-напреднали случаи на употреба обмислете тези техники:
1. Използване на build
Пакетът build
предоставя модерен и стандартизиран начин за изграждане на Python пакети. Той поддържа както Wheel, така и дистрибуции на изходния код и предлага по-опростен интерфейс от setuptools
.
pip install build python -m build
2. Редактируеми инсталации
Редактируемите инсталации ви позволяват да инсталирате пакет по начин, който се свързва директно към изходния код. Това е полезно за разработка, тъй като промените в изходния код се отразяват незабавно в инсталирания пакет, без да е необходимо да го преинсталирате.
pip install -e .
3. Персонализиране на процеса на изграждане
Можете да персонализирате процеса на изграждане, като дефинирате персонализирани скриптове за изграждане или използвате системи за изграждане като Meson или CMake. Това ви позволява да обработвате по-сложни сценарии за изграждане, като например изграждане на C разширения със специфични флагове на компилатора или свързване към външни библиотеки.
4. Използване на auditwheel
Инструментът auditwheel
се използва за проверка и поправяне на Linux Wheels, които съдържат споделени библиотеки. Той гарантира, че Wheel съдържа всички необходими зависимости, за да работи на широк спектър от Linux дистрибуции.
pip install auditwheel auditwheel repair dist/my_package-0.1.0-py39-linux_x86_64.whl
Заключение
Форматът за разпространение Wheel е основен инструмент за разработчиците на Python, които се стремят към ефикасно, надеждно и сигурно разпространение на пакети. Следвайки стъпките, описани в това ръководство, и възприемайки най-добрите практики, можете да създавате Wheel пакети, които рационализират процеса на инсталиране, намаляват зависимостите от инструменти за изграждане и подобряват цялостното потребителско изживяване. Независимо дали разпространявате пакети в общността с отворен код или внедрявате вътрешни приложения, разбирането и използването на формата Wheel е ценно умение за всеки разработчик на Python. Тъй като Python продължава да се развива, възприемането на съвременни практики за пакетиране като Wheel гарантира, че вашите проекти остават достъпни и лесни за поддръжка за глобална аудитория.
Възприемайки тези практики, вие допринасяте за по-стабилна и достъпна екосистема на Python по целия свят.