packageindex.md
1> **Источник:** https://python-all.ru/3.4/distutils/packageindex.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 6. Индекс пакетов Python (PyPI)89[Python Package Index (PyPI)](https://python-all.ru/3.4/distutils/packageindex.html) хранит [*метаданные*](https://python-all.ru/3.4/distutils/setupscript.html#meta-data), описывающие дистрибутивы, собранные с помощью distutils, а также данные пакетов, такие как файлы дистрибутивов, если автор пакета пожелает.1011Distutils предоставляет команды **register** и **upload** для отправки метаданных и файлов дистрибутивов в PyPI соответственно. См. [*Distutils commands*](https://python-all.ru/3.4/distutils/packageindex.html#package-commands) для получения информации об этих командах.1213## 6.1. Обзор PyPI1415PyPI позволяет отправлять в индекс любое количество версий вашего дистрибутива. Если вы измените метаданные для определённой версии, вы можете отправить их снова, и индекс будет обновлён.1617PyPI хранит запись для каждой комбинации (имя, версия). Первый пользователь, отправивший информацию для данного имени, назначается владельцем этого имени. Изменения можно отправлять через команду **register** или через веб-интерфейс. Владельцы могут назначать других пользователей владельцами или сопровождающими. Сопровождающие могут редактировать информацию о пакете, но не могут назначать новых владельцев или сопровождающих.1819По умолчанию PyPI отображает только самую новую версию данного пакета. Веб-интерфейс позволяет изменить это поведение по умолчанию и вручную выбрать, какие версии отображать, а какие скрывать.2021Для каждой версии PyPI отображает домашнюю страницу. Домашняя страница создаётся из `long_description`, который можно передать через команду **register**. Дополнительную информацию см. в [*отображении пакета на PyPI*](https://python-all.ru/3.4/distutils/packageindex.html#package-display).2223## 6.2. Команды Distutils2425Distutils предоставляет две команды для отправки данных пакетов в PyPI: команда [*register*](https://python-all.ru/3.4/distutils/packageindex.html#package-register) для отправки метаданных в PyPI и команда [*upload*](https://python-all.ru/3.4/distutils/packageindex.html#package-upload) для отправки файлов дистрибутивов. Обе команды читают конфигурационные данные из специального файла, называемого [*.pypirc-файл*](https://python-all.ru/3.4/distutils/packageindex.html#pypirc).2627### 6.2.1. Команда `register`2829Команда distutils **register** используется для отправки метаданных вашего дистрибутива на сервер индекса. Она вызывается следующим образом:3031```python32python setup.py register33```3435Distutils ответит следующим приглашением:3637```python38running register39We need to know who you are, so please choose either:40 1. use your existing login,41 2. register as a new user,42 3. have the server generate a new password for you (and email it to you), or43 4. quit44Your selection [default 1]:45```4647Примечание: если ваше имя пользователя и пароль сохранены локально, это меню не отобразится. Кроме того, обратитесь к [*файлу .pypirc*](https://python-all.ru/3.4/distutils/packageindex.html#pypirc), чтобы узнать, как хранить учётные данные в файле `.pypirc`.4849Если вы ещё не зарегистрированы в PyPI, вам необходимо сделать это сейчас. Следует выбрать вариант 2 и ввести свои данные по запросу. Вскоре после отправки данных вы получите электронное письмо, которое будет использовано для подтверждения регистрации.5051После регистрации вы можете выбрать вариант 1 из меню. Вас попросят ввести имя пользователя и пароль PyPI, а затем **register** отправит ваши метаданные в индекс.5253См. [*Дополнительные параметры команды*](https://python-all.ru/3.4/distutils/packageindex.html#package-cmdoptions) для параметров команды **register**.5455### 6.2.2. Команда `upload`5657Команда distutils **upload** отправляет файлы дистрибутивов в PyPI.5859Команда вызывается сразу после сборки одного или нескольких файлов дистрибутивов. Например, команда6061```python62python setup.py sdist bdist_wininst upload63```6465вызовет загрузку исходного дистрибутива и установщика для Windows на PyPI. Обратите внимание, что они будут загружены, даже если были собраны при предыдущем вызове `setup.py`, но загружаются только те дистрибутивы, которые указаны в командной строке вызова, включающего команду **upload**.6667Если команда **register** уже вызывалась в той же команде и пароль был введён в приглашении, **upload** использует введённый пароль повторно. Это полезно, если не требуется хранить пароль в открытом виде в файле `.pypirc`.6869Можно использовать опцию `--sign`, чтобы указать **upload** подписывать каждый загружаемый файл с помощью GPG (GNU Privacy Guard). Программа **gpg** должна быть доступна для выполнения в системе `PATH`. Также можно указать, какой ключ использовать для подписи, с помощью опции `--identity=name`.7071См. [*Дополнительные параметры команды*](https://python-all.ru/3.4/distutils/packageindex.html#package-cmdoptions) для дополнительных параметров команды **upload**.7273### 6.2.3. Дополнительные параметры команд7475В этом разделе описаны параметры, общие для команд **register** и **upload**.7677Опция `--repository` или `-r` позволяет указать сервер PyPI, отличный от сервера по умолчанию. Например:7879```python80python setup.py sdist bdist_wininst upload -r https://example.com/pypi81```8283Для удобства вместо URL можно использовать имя, если файл `.pypirc` настроен соответствующим образом. Например:8485```python86python setup.py register -r other87```8889См. [*.pypirc-файл*](https://python-all.ru/3.4/distutils/packageindex.html#pypirc) для получения дополнительной информации об определении альтернативных серверов.9091Опция `--show-response` отображает полный текст ответа от сервера PyPI, что полезно при отладке проблем с регистрацией и загрузкой.9293### 6.2.4. Файл `.pypirc`9495Команды **register** и **upload** проверяют существование файла `.pypirc` по пути `$HOME/.pypirc`. Если файл существует, команда использует имя пользователя, пароль и URL репозитория, заданные в файле. Формат файла `.pypirc` следующий:9697```python98[distutils]99index-servers =100 pypi101102[pypi]103repository: <repository-url>104username: <username>105password: <password>106```107108В разделе *distutils* определяется переменная *index-servers*, в которой перечисляются имена всех разделов, описывающих репозиторий.109110Каждый раздел, описывающий репозиторий, задаёт три переменные:111112- ***repository* – задаёт URL сервера PyPI. По умолчанию**113114 `https://www.python.org/pypi`115116 .117- *username* – зарегистрированное имя пользователя на сервере PyPI.118- ***password* – пароль для аутентификации. Если опущен, пользователю**119120 будет предложено ввести его при необходимости.121122Если требуется определить другой сервер, можно создать новый раздел и указать его в переменной *index-servers*:123124```python125[distutils]126index-servers =127 pypi128 other129130[pypi]131repository: <repository-url>132username: <username>133password: <password>134135[other]136repository: https://example.com/pypi137username: <username>138password: <password>139```140141Это позволяет вызывать команды **register** и **upload** с опцией `--repository`, как описано в [*дополнительных параметрах команды*](https://python-all.ru/3.4/distutils/packageindex.html#package-cmdoptions).142143В частности, может потребоваться добавить [тестовый репозиторий PyPI](https://python-all.ru/3.4/distutils/packageindex.html) в ваш `.pypirc`, чтобы упростить тестирование перед первой загрузкой на сам `PyPI`.144145## 6.3. Отображение пакетов PyPI146147Поле `long_description` играет особую роль на PyPI. Оно используется сервером для отображения домашней страницы зарегистрированного пакета.148149Если для этого поля используется синтаксис [reStructuredText](https://python-all.ru/3.4/distutils/packageindex.html), PyPI разберёт его и отобразит домашнюю страницу пакета в формате HTML.150151Поле `long_description` можно прикрепить к текстовому файлу, расположенному в пакете:152153```python154from distutils.core import setup155156with open('README.txt') as file:157 long_description = file.read()158159setup(name='Distutils',160 long_description=long_description)161```162163В этом случае `README.txt` – это обычный текстовый файл reStructuredText, расположенный в корне пакета рядом с `setup.py`.164165Чтобы предотвратить регистрацию некорректного содержимого reStructuredText, можно использовать программу **rst2html**, предоставляемую пакетом `docutils`, и проверить `long_description` из командной строки:166167```python168$ python setup.py --long-description | rst2html.py > output.html169```170171`docutils` выдаст предупреждение, если с синтаксисом что-то не так. Поскольку PyPI применяет дополнительные проверки (например, передавая `--no-raw` в `rst2html.py` в приведённой выше команде), возможность выполнить команду без предупреждений не гарантирует, что PyPI успешно преобразует содержимое.172