Статьи

Как поделиться своими пакетами Python

Пакеты Python являются строительными блоками приложений Python. Они содержат некоторые согласованные функции, которые могут быть импортированы и использованы многими приложениями и системами. Но сначала разработчики должны найти ваш пакет и иметь возможность его установить. Python предоставляет бесплатный общедоступный репозиторий для пакетов, который является стандартом де-факто для совместного использования пакетов Python. Вы также можете использовать частные репозитории пакетов для проприетарных пакетов.

Из этого руководства вы узнаете, как поделиться своими пакетами с сообществом. Если у вас есть проприетарные пакеты, которыми вы должны поделиться только внутри вашей компании, вы также узнаете, как это сделать.

Для справки смотрите Как использовать пакеты Python и Как писать свои собственные пакеты Python .

PyPI обозначает индекс пакета Python. Это публичный репозиторий для загрузки ваших пакетов. Pip знает о PyPI и может устанавливать и / или обновлять пакеты из PyPI. PyPI раньше называли «Магазином сыра» по знаменитому эскизу Монти Пайтона. Если вы слышите, как люди ссылаются на «Магазин сыра» в контексте упаковки Python, не пугайтесь. Это просто PyPI.

Перед загрузкой пакета вам необходимо иметь пакет. Я буду использовать пакет conman, который я представил в статье Как написать свой собственный пакет Python . Поскольку PyPI содержит тысячи пакетов, очень важно правильно описать ваш пакет, если вы хотите, чтобы люди его нашли. PyPI поддерживает впечатляющий набор метаданных тегов, чтобы люди могли найти подходящий пакет для работы.

Файл setup.py содержит много важной информации, используемой для установки вашего пакета. Но он также может включать метаданные, используемые для классификации вашего пакета в PyPI. Пакеты классифицируются с использованием нескольких тегов метаданных. Некоторые из них являются текстовыми, а некоторые имеют список возможных значений. Полный список доступен на странице классификаторов списков PyPI.

Давайте добавим несколько классификаторов в setup.py . Нет необходимости увеличивать номер версии, поскольку это только метаданные, а код остается прежним:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from setuptools import setup, find_packages
 
 
 
setup(name=’conman’,
 
      version=’0.3′,
 
      url=’https://github.com/the-gigi/conman’,
 
      license=’MIT’,
 
      author=’Gigi Sayfan’,
 
      author_email=’the.gigi@gmail.com’,
 
      description=’Manage configuration files’,
 
      classifiers=[
 
          ‘Development Status :: 3 — Alpha’,
 
          ‘Intended Audience :: Developers’,
 
          ‘Topic :: Software Development :: Libraries’,
 
          ‘License :: OSI Approved :: MIT License’,
 
          ‘Programming Language :: Python :: 2’,
 
          ‘Programming Language :: Python :: 2.6’,
 
          ‘Programming Language :: Python :: 2.7’,
 
      ],
 
      packages=find_packages(exclude=[‘tests’]),
 
      long_description=open(‘README.md’).read(),
 
      zip_safe=False,
 
      setup_requires=[‘nose>=1.0’],
 
      test_suite=’nose.collector’)

Вам нужно создать учетную запись на PyPI, чтобы иметь возможность загружать пакеты. Заполните эту форму и подтвердите свою личность, нажав на URL в письме с подтверждением. Теперь вам нужно создать файл .pypyrc в вашем домашнем каталоге, который будет содержать информацию, необходимую для загрузки пакетов.

01
02
03
04
05
06
07
08
09
10
11
[distutils]
 
index-servers=pypi
 
 
 
[pypi]
 
repository = https://pypi.python.org/pypi
 
username = the_gigi

Вы также можете добавить свой пароль, но это безопаснее, если вы не добавите какой-то плохой элемент к вашему ноутбуку. Это особенно важно, если вы загружаете популярные пакеты, потому что если кто-то может загрузить или обновить ваши пакеты, все люди, которые используют эти пакеты, будут уязвимы.

Если вы хотите протестировать процесс регистрации пакета и загрузки и не беспокоиться о публикации чего-то неполного, вы можете работать с альтернативным сайтом тестирования PyPI . Расширьте файл ~ / .pypirc, включив в него раздел «pypitest».

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[distutils]
 
index-servers=
 
    pypi
 
    pypitest
 
 
 
[pypitest]
 
repository = https://testpypi.python.org/pypi
 
username = the_gigi
 
 
 
[pypi]
 
repository = https://pypi.python.org/pypi
 
username = the_gigi

Помните, что тестовый сайт регулярно очищается, поэтому не полагайтесь на него. Он предназначен только для тестирования.

Если это первый выпуск вашего пакета, вам необходимо зарегистрировать его в PyPI. У Twine есть команда register, но я не могу понять, как ее использовать. Следование документации выдает ошибку, и при проверке модульных тестов на шпагат тест для команды регистрации отсутствует. Ну что ж. Вы также можете сделать это вручную, используя эту форму, чтобы загрузить файл PKG-INFO. Если вы используете Python 2.7.9+ или Python 3.2+, вы также можете безопасно зарегистрироваться, используя python setup.py register .

Давайте зарегистрируем conman на тестовом сайте PyPI. Обратите внимание на параметр -r pypitest , который на основе раздела в ~/.pypirc будет зарегистрирован на тестовом сайте.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
python setup.py register -r pypitest
 
running register
 
running egg_info
 
writing conman.egg-info/PKG-INFO
 
writing top-level names to conman.egg-info/top_level.txt
 
writing dependency_links to conman.egg-info/dependency_links.txt
 
reading manifest file ‘conman.egg-info/SOURCES.txt’
 
reading manifest template ‘MANIFEST.in’
 
writing manifest file ‘conman.egg-info/SOURCES.txt’
 
running check
 
Password:
 
Registering conman to https://testpypi.python.org/pypi
 
Server response (200): OK

Вы можете загрузить пакет, используя python setup.py upload , но это небезопасно, поскольку используется для отправки вашего имени пользователя и пароля по HTTP до Python 2.7.9 и Python 3.2. Twine всегда использует HTTPS и имеет дополнительные преимущества, такие как загрузка предварительно созданных дистрибутивов, и поддерживает любой формат упаковки, включая колеса. Я буду использовать шпагат для фактической загрузки.

Twine не является частью стандартной библиотеки, поэтому вам необходимо установить его: pip install twine .

Наконец, пришло время загрузить пакет.

1
2
3
4
5
6
7
8
9
> twine upload -r pypitest -p ******* dist/*
 
Uploading distributions to https://testpypi.python.org/pypi
 
Uploading conman-0.3-py2-none-any.whl
 
Uploading conman-0.3-py2.py3-none-any.whl
 
Uploading conman-0.3.tar.gz

Twine загрузил все форматы дистрибутива, как исходный текст, так и диски

Twine uploaded all the distribution formats

Как только ваш пакет находится на PyPI, вы должны убедиться, что можете установить его, и все работает. Здесь я создаю одноразовую виртуальную среду, устанавливаю pip conman с сайта тестирования PyPI, а затем импортирую ее. Возможно, вы захотите запустить более тщательные тесты для вашего пакета.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
> mkvirtualenv test_conman_pypi
 
New python executable in test_conman_pypi/bin/python2.7
 
Also creating executable in test_conman_pypi/bin/python
 
Installing setuptools, pip…done.
 
Usage: source deactivate
 
 
 
removes the ‘bin’ directory of the environment activated with ‘source
 
activate’ from PATH.
 
(test_conman_pypi) > pip install -i https://testpypi.python.org/pypi conman
 
Downloading/unpacking conman
 
  Downloading conman-0.3-py2-none-any.whl
 
  Storing download in cache at /Users/gigi/.cache/pip/https%3A%2F%2Ftestpypi.python.org%2Fpackages%2Fpy2%2Fc%2Fconman%2Fconman-0.3-py2-none-any.whl
 
Installing collected packages: conman
 
Successfully installed conman
 
Cleaning up…
 
(test_conman_pypi) > python
 
Python 2.7.10 (default, Jun 10 2015, 19:43:32)
 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
 
Type «help», «copyright», «credits» or «license» for more information.
 
>>> import conman
 
>>>

Обратите внимание, что распределение колес было установлено по умолчанию.

Когда вы развиваете свои пакеты и загружаете новые версии, важно следовать разумной схеме управления версиями. Люди будут очень расстроены, если непреднамеренное обновление нарушит их код. Ваша схема управления версиями должна соответствовать PEP-440 — Идентификация версии и спецификация зависимостей .

Эта спецификация позволяет выбирать из нескольких схем. Я рекомендую использовать популярную схему Semantic Versioning . Это в значительной степени «<major>. <Minor>. <Patch>», что соответствует PEP-440 «<major>. <Minor>. <Micro>». Просто остерегайтесь версий, продолжающих дефис или знаки плюс, которые не совместимы с PEP-440.

PyPI великолепен, но иногда вы не хотите делиться своими пакетами. Во многих компаниях и организациях есть инженерные команды, которые используют Python и должны обмениваться пакетами между ними, но им запрещено публиковать их публично в PyPI. Это не проблема. Вы можете делиться пакетами в частных репозиториях пакетов под вашим контролем.

Обратите внимание, что иногда вы можете захотеть иметь закрытое хранилище пакетов под вашим контролем, чтобы управлять сторонними зависимостями. Например, автор пакета может решить удалить пакет из PyPI. Если ваша система полагается на возможность установки этого пакета из PyPI, у вас проблемы.

Devpi (что означает «Индекс пакета разработки») является заменой общедоступного сервера PyPI. Он имеет открытый исходный код и лицензирован по MIT, поэтому вы можете запустить его в своем брандмауэре. Devpi очень мощный и имеет много функций, которые позволяют ему функционировать как ваш конечный сервер упаковки:

  • Быстрое зеркало PyPI
  • Загрузка, тестирование и размещение с частными индексами
  • Индекс наследования
  • Веб-интерфейс и поиск
  • копирование
  • Импорт / Экспорт
  • Интеграция Дженкинса

Devpi имеет отличную документацию, систему плагинов и находится в активной разработке с активным сообществом.

Python предоставляет комплексное решение для размещения ваших пакетов и предоставления их вашим коллегам по Pythonistas. Существует упрощенный процесс, которому помогают инструменты для упаковки и загрузки пакетов и облегчают их поиск и установку.

Если вам нужно держать вещи в секрете, Devpi здесь для вас как зрелого и надежного частного хранилища пакетов.