Сборка пакетов Python#
Документация: https://packaging.python.org/en/latest/
Здесь я рассмотрю сборку пакета и его публикацию в PyPI на примере скрипта с интерфейсом командной строки.
Для этих целей потребуется установить несколько пакетов:
pip install setuptools wheel twine
setup.py#
Этот файл содержит метаданные пакета, список зависимостей и другую информацию, которую может использовать пакетный менеджер pip. Вот пример setup.py для одного из моих проектов:
1from setuptools import setup
2
3
4with open("README.md", "r") as long_descr:
5 long_description = long_descr.read()
6
7setup(
8 name = 'Peji',
9 version = '1.0.2',
10 author = 'ge',
11 description = 'Static site generator.',
12 long_description = long_description,
13 long_description_content_type = "text/markdown",
14 url = 'https://peji.gch.icu/',
15 classifiers = [
16 "Programming Language :: Python :: 3.9",
17 "License :: OSI Approved :: The Unlicense (Unlicense)",
18 "Operating System :: OS Independent",
19 ],
20 python_requires = '>=3.6',
21 py_modules = ['peji'],
22 install_requires = [
23 'click',
24 'markdown',
25 'Jinja2',
26 'Pygments',
27 'PyYAML'
28 ],
29 entry_points = {
30 'console_scripts': [
31 'peji = peji:cli'
32 ]
33 }
34)
Здесь список console_scripts
указывает имена модулей и функции (через
двоеточие), которые надо импортировать для создания обёрток для CLI. Вот
такой скрипт будет автоматически создан пакетным менеджером при установке
пакета (~/.local/bin/peji или /usr/local/bin/peji при глобальной установке):
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3import re
4import sys
5from peji import cli
6if __name__ == '__main__':
7 sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8 sys.exit(cli())
PyPI и Test PyPI#
Прежде всего надо зарегистрировать аккаунты на сайтах https://pypi.org и https://test.pypi.org.
Загрузку пакета в публичный репозиторий надо делать осторожно, так как косяки при публикации сложно исправить. Если опубликованный релиз оказался кривым, то придётся спешно удалять его из репозитория и затем менять версию, так как в PyPI нельзя дважды загрузить одну и ту же версию пакета, даже если она перед этим была удалена. Это требование безопасности, чтобы затруднить подмену пакетов злоумышленниками. По этой причине в том числе лучше сначала загрузить пакет в testpypi, протестить и только затем публиковать в pypi.
В PyPI также есть ограничение на имена пакетов. Имя должно быть уникальным. Получить имя, которое ранее было кем-то занято очень сложно и долго, если вообще возможно. Поэтому позаботиться об имени пакета нужно заранее.
Сборка и публикация пакета#
Непосредственно сборка пакета выполняется командой:
python setup.py sdist bdist_wheel
Загрузка в тестовый PyPI:
twine upload --repository testpypi dist/*
Загрузка в настоящий PyPI:
twine upload --repository pypi dist/*