> **Источник:** https://python-all.ru/3.1/distutils/uploading.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 7. Загрузка пакетов в индекс пакетов

Индекс пакетов Python (PyPI) не только хранит информацию о пакете, но и данные пакета, если того желает автор. Команда distutils **upload** отправляет файлы дистрибутива на PyPI.

Команда вызывается сразу после сборки одного или нескольких файлов дистрибутивов. Например, команда

```python
python setup.py sdist bdist_wininst upload
```

вызовет загрузку исходного дистрибутива и установщика для Windows на PyPI. Обратите внимание, что они будут загружены, даже если были собраны при предыдущем вызове `setup.py`, но загружаются только те дистрибутивы, которые указаны в командной строке вызова, включающего команду **upload**.

Команда **upload** использует имя пользователя, пароль и URL репозитория из файла `$HOME/.pypirc` (см. раздел [*Файл .pypirc*](https://python-all.ru/3.1/distutils/packageindex.html#pypirc) для получения дополнительной информации об этом файле). Если команда **register** ранее вызывалась в той же команде, и пароль был введён в приглашении, **upload** повторно использует введённый пароль. Это полезно, если вы не хотите хранить пароль в открытом виде в файле `$HOME/.pypirc`.

Можно указать другой сервер PyPI с помощью опции *--repository=\*url\**:

```python
python setup.py sdist bdist_wininst upload -r http://example.com/pypi
```

См. раздел [*Файл .pypirc*](https://python-all.ru/3.1/distutils/packageindex.html#pypirc) для получения дополнительной информации об определении нескольких серверов.

Можно использовать опцию *--sign*, чтобы указать **upload** подписывать каждый загружаемый файл с помощью GPG (GNU Privacy Guard). Программа **gpg** должна быть доступна для выполнения в системе **PATH**. Также можно указать, какой ключ использовать для подписи, с помощью опции *--identity=\*name\**.

Другие опции **upload** включают *--repository=* или *--repository=*, где *url* – это URL сервера, а *section* – имя раздела в `$HOME/.pypirc`, и *--show-response* (которая отображает полный текст ответа от сервера PyPI для помощи в отладке проблем загрузки).

## 7.1. Отображение пакета PyPI

Поле `long_description` играет особую роль на PyPI. Оно используется сервером для отображения домашней страницы зарегистрированного пакета.

Если для этого поля используется синтаксис [reStructuredText](https://python-all.ru/3.1/distutils/uploading.html), PyPI разберёт его и отобразит домашнюю страницу пакета в формате HTML.

Поле `long_description` можно прикрепить к текстовому файлу, расположенному в пакете:

```python
from distutils.core import setup

with open('README.txt') as file:
    long_description = file.read()

setup(name='Distutils',
      long_description=long_description)
```

В этом случае `README.txt` – это обычный текстовый файл reStructuredText, расположенный в корне пакета рядом с `setup.py`.

Чтобы предотвратить регистрацию некорректного содержимого reStructuredText, можно использовать программу **rst2html**, которая предоставляется пакетом `docutils`, и проверить `long_description` из командной строки:

```python
$ python setup.py --long-description | rst2html.py > output.html
```

`docutils` выведет предупреждение, если с синтаксисом что-то не так.
