Иногда библиотеки просто не подходят
Быстрые заметки
Убедитесь, что мы на одной волне.
- Менеджер пакетов 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
Лицензия на ваш код. Если вы не уверены, это может вам помочь.
Это было много, чтобы справиться сразу, но в конце структура вашего проекта должна выглядеть примерно так:
Весь исходный код можно найти здесь.
Тестирование пакета
Так что, надеюсь, вы дошли до этого момента без ошибок, и если да, то вы в основном закончили! Давайте протестируем наш код локально, чтобы убедиться, что он работает:
- Сначала мы хотим перейти в каталог с нашим
setup.py
, в нашем случае это будетexample_directory/
. - Далее мы запустим команду
python3 setup.py sdist bdist_wheel
, чтобы сгенерировать нашу папкуdist/
.
Теперь, когда пакет установлен, попробуйте выполнить некоторые команды:
И, надеюсь, это работает!
Загрузка на тестовую платформу
Этот шаг совершенно необязателен и может быть пропущен; однако, если вы хотите узнать, как ваш пакет будет работать на реальных серверах PyPI, стоит попробовать это.
- Сначала создайте аккаунт на тестовом сайте PyPI.
- Затем запустите
python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
, чтобы загрузить файлы. - Наконец, запустите
python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps Example_Functional_Package
, гдеExample_Functional_Package
— это имя вашего пакета.
И вы можете увидеть, как ваш пакет будет работать на живых серверах!
Загрузка в PyPI
Почти идентично тестовой настройке PyPI, но с реальным веб-сайтом:
- Сначала зарегистрируйтесь на сайте PyPI.
- Затем запустите
twine upload dist/*
илиpython3 -m twine upload dist/*
, чтобы загрузить файлы. - Наконец, запустите
pip install Example_Functional_Package
, гдеExample_Functional_Package
— это имя вашего пакета.
Если он успешно устанавливается, попробуйте еще раз протестировать программу:
И если все хорошо, вы должны быть сделаны!
Модульнотфаундеррор
Одна из самых распространенных ошибок, которую я получал, что-то вроде ModuleNotFoundError: No module named X
. Чаще всего это вызвано проблемами импорта (см. раздел «Быстрые заметки») и проблемами в поле packages
в setup.py
Первоначально опубликовано на http://github.com.