Сборка пакетов 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/*