English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Подробное объяснение методов публикации Python модулей

Введение

Вчера я打包 и загрузил свою библиотеку обработки файлов VASP на PyPI, теперь вы можете устанавливать VASPy напрямую через pip и easy_install (в то же время я очень рад видеть, что ребята, которые используют VASP для вычислительной химии, добавляют звезды и участвуют в этом),

Адрес GotHub VASPy:https://github.com/PytLab/VASPy
Адрес PyPI VASPy:https://pypi.python.org/pypi/vaspy/

Поскольку моя память оставляет желать лучшего, боюсь, что через некоторое время я забуду, поэтому я решил написать это здесь, используя свой пример программы VASPy, чтобы сделать краткое резюме о打包 и загрузке python.

Структура файла пакета VASPy

Сначала нужно написать структуру всего файла пакета VASPy, все последующие материалы будут объясняться на этом примере:

VASPy/
├── LICENSE
├── MANIFEST
├── MANIFEST.in
├── README.rst
├── requirements.txt
├── scripts
│  ├── change_incar_parameters.py
│  ├── create_inputs.py
│  └── ...
├── setup.cfg
├── setup.py
├── tests
│  ├── incar_test.py
│  ├── __init__.py
│  ├── oszicar_test.py
│  ├── outcar_test.py
│  ├── testdata
│  │  ├── CONTCAR
│  │  ├── DOS_SUM
│  │  ├── ELFCAR
│  │  └── ...
│  └── ...
└── vaspy
  ├── __init__.py
  ├── iter.py
  ├── matstudio.py
  └── ...
4 директории, 54 файла

Инструмент для打包 и установки сторонних пакетов

Здесь нам нужно использовать инструменты, такие как setuptools и pip, для打包 и публикации нашего пакета, а также для его установки. Если нужно создать wheel, необходимо также установить модуль wheel. Если версия python >= 2.7.9 или >= 3.4, setuptools и pip уже установлены, возможно, их нужно обновить до последней версии

pip install -U pip setuptools

Можно использовать инструмент управления пакетами, например

yum install pip
sudo apt-get install pip

Установлен через скрипт get-pip.py, если обнаружено, что не установлены wheel и setuptools, они также будут автоматически установлены

python get-pip.py

Подробности о herramienta установке и их описание не будем рассматривать, можно обратиться к requirements для установки пакетов

Роль различных файлов в пакете

setup.py

Этот файл является наиболее важным файлом для打包 всего проекта, он предоставляет две основные функции:

Функция setup(), параметры которой определяют конфигурацию вашего проекта.
Командная строка, включая打包, тестирование, публикацию и т.д. можно посмотреть с помощью следующих команд;

python setup.py --help-commands

setup.cfg

Этот файл содержит некоторые стандартные параметры для 构建, такие как параметр --universal при создании bdist_wheel

[bdist_wheel]
universal=1

Таким образом, при каждом打包 будет автоматически использоваться параметр --universal, эффект аналогичен:

python setup.py bdist_wheel --universal

README.rst

Этот первый я написал с помощью markdown, после打包发布到PyPI я обнаружил, что PyPI не поддерживает рендеринг markdown, страница была полна хаоса, поэтому я переработал её с использованием синтаксиса reStructuredText. В конце концов, синтаксис маркеровых языков легко освоить, если что, всегда можно найти шаблон и нарисовать как лукоморку.
Правила синтаксиса reStructuredText можно найти в официальной документации: Quick reStructuredText

На самом деле,还存在 ещё один метод - использование pandoc для преобразования markdown в формат rst, одним из удобных способов является использование модуля pyandoc для автоматического преобразования при发布了.
Конкретные методы можно найти в: Использование Markdown README в Python модулях

MANIFEST.in

Этот файл указывает setuptools какие файлы нужно дополнительно打包 при打包, например, в VASPy я использую этот файл, чтобы включить тестовые данные для тестирования, конечно, README, LICENSE и т.д. также можно включить с помощью этого файла.
Ниже приведено содержимое моего MANIFEST.in:

include README.rst
include requirements.txt
include LICENSE
recursive-include scripts *
recursive-include tests *

Конкретные правила синтаксиса можно найти в: шаблон MANIFEST.in

vaspy/

Эта папка - это пакет, в котором находится исходный код vaspy.

tests/

Эта папка также является подпакетом, который содержит скрипты для тестирования, чтобы можно было использовать python setup.py test для выполнения тестирования,特地 добавлен __init__.py, чтобы сделать его пакетом.

параметры setup()

Здесь описаны только несколько параметров, которые я использую, более детальное использование других параметров можно найти в:https://docs.python.org/3/distutils/setupscript.html

name

versions = "vaspy"

Это имя всего проекта, которое будет использоваться вместе с номером версии после打包.

version

from vaspy import __version__
version = __version__

description

Это краткое описание проекта, обычно одна строка, которое будет отображаться под названием на PyPI.

long_description

Это длинное описание, эквивалентное краткому изложению проекта, если эта строка является форматом rst, PyPI автоматически преобразует её в HTML для отображения. Здесь可以直接读取 содержимое README.rst.

url

Package links, usually links on GitHub or readthedocs.

packages

List of subpackages to include, setuptools provides find_packages() to help us find packages under the root path, which is a function that distutil does not have.

setup_requires

This parameter defines the other dependencies required for the installation and smooth operation of VASPy (the most basic ones), and these dependencies will be installed when using pip.
For the difference between this parameter and requirements.txt, refer to: install_requires vs Requirements files

classifier

This parameter provides a series of classifications, which will be placed in different directories on PyPI to classify projects.
For the specific names and rules of categories, refer to:https://pypi.python.org/pypi?%3Aaction=list_classifiers

test_suite

This parameter can help us use

python setup.py test

To run unit tests, there is no longer a need to write a separate script like run_tests.py to run unit tests.
The official explanation of this parameter:

A string naming a unittest.TestCase subclass (or a package or module containing one or more of them, or a method of such a subclass), or naming a function that can be called with no arguments and returns a unittest.TestSuite. If the named suite is a module, and the module has an additional_tests() function, it is called and the results are added to the tests to be run. If the named suite is a package, any submodules and subpackages are recursively added to the overall test suite.

Таким образом, этот параметр может принимать несколько типов параметров:

Получение подкласса unittest.TestCase, мы можем написать все единичные тесты в одном тестовом примере, импортировать его и передать в test_suite.
Получение объекта функции, этот объект функции не имеет параметров и возвращает unittest.TestSuite. Таким образом, мы можем написать одну функцию, объединить несколько тестовых примеров в suite и вернуть ее, а затем импортировать функцию и передать ее в test_suite.

Имя модуля и пакета, я использую этот способ, все мои предыдущие тесты были разделены на несколько скриптов, таким образом, добавив __init__.py, я могу превратить его в пакет, передав имя пакета в test_suite, setuptools чудесным образом запустит все тесты в этом пакете, поэтому при добавлении новых тестовых скриптов я могу просто добавить новые скрипты, не needing any other changes.

Результат выполнения:

zjshao@SHAO-PC:/mnt/d/Dropbox/Code/CentOS_code/VASPy$ python setup.py test
запуск теста
запуск egg_info
создание vaspy.egg-info
запись vaspy.egg-info/PKG-INFO
запись имен верхнего уровня в vaspy.egg-info/top_level.txt
запись зависимостей в vaspy.egg-info/dependency_links.txt
запись файла манифеста 'vaspy.egg-info/SOURCES.txt'
чтение файла манифеста 'vaspy.egg-info/SOURCES.txt'
чтение шаблона манифеста 'MANIFEST.in'
запись файла манифеста 'vaspy.egg-info/SOURCES.txt'
запуск build_ext
test_compare (tests.incar_test.InCarTest)
Убедитесь, что мы можем правильно сравнивать два объекта InCar. ... хорошо
test_eq (tests.incar_test.InCarTest)
Тест функции __eq__(). ... ok
...
Здесь пропущены некоторые результаты
-------------------------------------------------------------------------
Запущено 22 теста за 3.574с
OK

Публикация своих python пакетов

1. Сначала зарегистрируйтесь на PyPI

2. Настройте ~/.pypirc следующим образом:

[distutils]
index-servers =
  pypi
  pypitest
[pypi]
имя пользователя:ShaoZhengjiang
пароль:mypassword
[pypitest]
имя пользователя:ShaoZhengjiang
пароль:mypassword

3. Затем зарегистрируйте и загрузите свои пакеты на тестовый сервер

pypi предоставляет тестовый сервер, на котором мы можем провести тестирование.

python setup.py register -r pypitest

Затем

python setup.py sdist upload -r pypitest

Если не возникло проблем,我们应该不会得到任何错误。

4. Загрузка на PyPI

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

python setup.py register -r pypi
python setup.py sdist upload -r pypi

OK, после этого мы можем использовать PyPI(https://pypi.python.org/pypi/vaspy/На экране我们看到 свои пакеты.

Основной курс
Рекомендуем также