Advertisement
  1. Code
  2. Coding Fundamentals
  3. OOP

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

Scroll to top
Read Time: 7 min

() translation by (you can also view the original English article)

Обзор

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

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

Для получения дополнительной информации см. Раздел «Как использовать пакеты Python и как писать собственные пакеты Python».

Что такое PyPI?

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

Подготовьте пакет для загрузки

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

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

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

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

Заводим аккаунт

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

1
[distutils]
2
3
index-servers=pypi
4
5
6
7
[pypi]
8
9
repository = https://pypi.python.org/pypi
10
11
username = the_gigi
12

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

Тестирование

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

1
[distutils]
2
3
index-servers=
4
5
    pypi
6
7
    pypitest
8
9
10
11
[pypitest]
12
13
repository = https://testpypi.python.org/pypi
14
15
username = the_gigi
16
17
18
19
[pypi]
20
21
repository = https://pypi.python.org/pypi
22
23
username = the_gigi
24

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

Зарегистрируйте свой пакет

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

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

1
python setup.py register -r pypitest
2
3
running register
4
5
running egg_info
6
7
writing conman.egg-info/PKG-INFO
8
9
writing top-level names to conman.egg-info/top_level.txt
10
11
writing dependency_links to conman.egg-info/dependency_links.txt
12
13
reading manifest file 'conman.egg-info/SOURCES.txt'
14
15
reading manifest template 'MANIFEST.in'
16
17
writing manifest file 'conman.egg-info/SOURCES.txt'
18
19
running check
20
21
Password:
22
23
Registering conman to https://testpypi.python.org/pypi
24
25
Server response (200): OK

Twine

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

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

Загрузите свой пакет

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

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

Twine загрузил все форматы распространения, как источник, так и wheels.

Twine uploaded all the distribution formatsTwine uploaded all the distribution formatsTwine uploaded all the distribution formats

Проверьте свой пакет

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

1
> mkvirtualenv test_conman_pypi
2
3
New python executable in test_conman_pypi/bin/python2.7
4
5
Also creating executable in test_conman_pypi/bin/python
6
7
Installing setuptools, pip...done.
8
9
Usage: source deactivate
10
11
12
13
removes the 'bin' directory of the environment activated with 'source

14


15
activate' from PATH.
16
17
(test_conman_pypi) > pip install -i https://testpypi.python.org/pypi conman
18
19
Downloading/unpacking conman
20
21
  Downloading conman-0.3-py2-none-any.whl
22
23
  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
24
25
Installing collected packages: conman
26
27
Successfully installed conman
28
29
Cleaning up...
30
31
(test_conman_pypi) > python
32
33
Python 2.7.10 (default, Jun 10 2015, 19:43:32)
34
35
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
36
37
Type "help", "copyright", "credits" or "license" for more information.
38
39
>>> import conman
40
41
>>>

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

Версионирование

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

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

Репозитории частных пакетов

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

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

Devpi

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

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

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

Заключение

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

Если вам нужно сохранять конфиденциальность, Devpi - это то что вам нужно.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.