English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Введение
Вчера я打包 и загрузил свою библиотеку обработки файлов 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/На экране我们看到 свои пакеты.