Иногда библиотеки просто не подходят

Быстрые заметки

Убедитесь, что мы на одной волне.

  • Менеджер пакетов Python pip использует веб-сайт PyPi.org для распространения пакетов и управления ими. Таким образом, загружая пакет в PyPI, вы также загружаете его в pip.
  • Пакет — это папка, содержащая файлы, необходимые для запуска вашей программы.
  • Все перечисленные команды предназначены для Linux. Если вы используете другую операционную систему, например Windows, вы можете использовать другие команды, например python вместо python3.
  • В своих файлах я использую example_directory, но я загружаю пакет как Example-Functional-Package, поэтому я называю его по-другому.
  • Если ваш основной файл импортирует другой локальный файл (что, вероятно, и произойдет), вам придется импортировать по-другому: если бы я хотел импортировать файл Python modules.py из того же каталога, я бы написал from . import modules Вместо записи import modules
  • Весь код, использованный в туториале, можно найти здесь.

Установка зависимостей

Убедитесь, что у вас есть необходимые библиотеки.

Создание проекта

Давайте создадим быстрый проект для публикации. Во-первых, у нас есть пустая папка пакета:

Теперь давайте добавим несколько файлов:

В этом файле будут наши методы, которые мы будем вызывать. Давайте добавим несколько основных числовых методов:

И для примера давайте тоже создадим папку config/ и добавим некоторые методы манипулирования данными:

Теперь в итоге наш modules.py будет выглядеть примерно так:

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

usage: parser [-h] [-f FIBONACCI] [-b FIZZBUZZ] [-s SAVE] [-p]
Does cool stuff.
optional arguments:
  -h, --help            show this help message and exit
Sequences Commands:
  Generates number sequences
-f FIBONACCI, --fibonacci FIBONACCI
                        Calculates the first N numbers in the Fibonacci sequence
  -b FIZZBUZZ, --fizzbuzz FIZZBUZZ
                        Calculates the first N values of the      FizzBuzz sequence.
Data Management:
  Saves and manages files
-s SAVE, --save SAVE  Pass in a file path. Saves the file to the /data
                        folder in this project.
  -p, --print           Prints all files saved in the /data folder

Структура нашего пакета должна выглядеть примерно так:

Целью этого руководства является то, что я хочу иметь возможность запускать файл анализатора аргументов из командной строки, например:

Создание файлов упаковки

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

README.md

файл, описывающий ваш проект. Текст в этом файле отображается под описанием вашего пакета. Убедитесь, что он находится в той же папке, что и ваш пакет (но не внутри вашего пакета). Может выглядеть примерно так:

__init__.py

файл, который вызывается при сборке пакета. Поместите это в свой пакет(ы), иначе они не будут найдены; файл может быть полностью пустым, но он должен существовать. У нас будет пусто.

setup.py

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

Объяснение параметров

В файле setup.py есть много опций для сборки вашего пакета, и важно знать о них; однако я описываю только некоторые параметры.

название

Имя пакета при его распространении. Имейте в виду, что оно может отличаться от имени вашего локального пакета (имя моего локального пакета example_directory, но я загружаю его как Example-Functional-Package).

версия

Версия проекта. Вероятно, вам следует использовать семантическое управление версиями.

автор

Люди, создавшие проект. Будет отображаться в информации о пакете.

author_email

Адрес электронной почты, указанный в информации о пакете.

описание

Краткое описание, которое появляется в превью пакета.

длинное описание

Подробное описание, которое отображается при просмотре веб-страницы пакета из PyPI.

long_description_content_type

Формат, в котором находится длинное описание. У нас уценка, поэтому мы ставим text/markdown.

URL

Если исходный код пакета где-то размещен, укажите URL-адрес здесь. Обычно ссылка на GitHub.

пакеты

Имя пакета(ов) в папке (имя каталога). Настройка вашего проекта была бы другой, если бы было несколько подпакетов.

данные пакета

Если у вас есть какие-либо статические файлы, укажите пути здесь. Сначала перечислите пакет, а затем любые каталоги в пакете. В нашем случае это каталог example_package, а папка data — это подпапка, которую мы хотим включить.

ключевые слова

Слова, используемые при поиске. Они помогают людям найти вашу посылку.

классификаторы

Теги, которые идут с вашей посылкой. Дает дополнительную информацию о вашем проекте. Все классификаторы вы можете найти на сайте PyPI.

entry_points

Имеет несколько параметров, но нас интересует console_scripts, функция, которая позволяет нам вызывать нашу функцию из командной строки. console_scripts автоматически регистрируется на пути. Синтаксис следующий:

{command to be called by}={folder/package name}.{python file}:{function}

поскольку мы создали parser=example_package.parser:main, мы можем вызвать функцию main внутри example_package/parser.py с именем parser из командной строки.

python_requires

Версии Python, необходимые для запуска скрипта.

LICENSE

Лицензия на ваш код. Если вы не уверены, это может вам помочь.

Это было много, чтобы справиться сразу, но в конце структура вашего проекта должна выглядеть примерно так:

Весь исходный код можно найти здесь.

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

Так что, надеюсь, вы дошли до этого момента без ошибок, и если да, то вы в основном закончили! Давайте протестируем наш код локально, чтобы убедиться, что он работает:

  1. Сначала мы хотим перейти в каталог с нашим setup.py, в нашем случае это будет example_directory/.
  2. Далее мы запустим команду python3 setup.py sdist bdist_wheel, чтобы сгенерировать нашу папку dist/.

Теперь, когда пакет установлен, попробуйте выполнить некоторые команды:

И, надеюсь, это работает!

Загрузка на тестовую платформу

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

  1. Сначала создайте аккаунт на тестовом сайте PyPI.
  2. Затем запустите python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*, чтобы загрузить файлы.
  3. Наконец, запустите python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps Example_Functional_Package, где Example_Functional_Package — это имя вашего пакета.

И вы можете увидеть, как ваш пакет будет работать на живых серверах!

Загрузка в PyPI

Почти идентично тестовой настройке PyPI, но с реальным веб-сайтом:

  1. Сначала зарегистрируйтесь на сайте PyPI.
  2. Затем запустите twine upload dist/* или python3 -m twine upload dist/*, чтобы загрузить файлы.
  3. Наконец, запустите pip install Example_Functional_Package, где Example_Functional_Package — это имя вашего пакета.

Если он успешно устанавливается, попробуйте еще раз протестировать программу:

И если все хорошо, вы должны быть сделаны!

Модульнотфаундеррор

Одна из самых распространенных ошибок, которую я получал, что-то вроде ModuleNotFoundError: No module named X. Чаще всего это вызвано проблемами импорта (см. раздел «Быстрые заметки») и проблемами в поле packages в setup.py

Первоначально опубликовано на http://github.com.