В настоящее время я разрабатываю пакет TreeSet/TreeMap, используя базовую библиотеку деревьев C RedBlack. Я разработал расширение-оболочку и, чтобы ограничить количество двоичных колес, использовал стабильный ABI. Для сборки дистрибутивов пакетов я использую build с файлом конфигурации pyproject.toml и setuptools в качестве серверной части.
Проблема
Команда python -m build (или pip install .) может построить только колесо с тегом -cpxx-cpxx-platform (например, -cp38-cp38-linux_x86_64.whl в Linux или -0.1.0-cp310-cp310-win_amd64.whl в Windows). Используя непосредственно setuptools с файлами setup.py и setup.config, можно создать колесо с тегом cpxx-abi3-platform с помощью команды:< /p>
Код: Выделить всё
python setup.py bdist_wheel --py-limited-api=cpxx
Текущая конфигурация для упрощенного примера
Код: Выделить всё
pyproject.tomlКод: Выделить всё
[build-system]
requires = ["setuptools>=60.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "empty"
version = "0.1.0"
authors = [
{ name="SBA", email="s-ball@laposte.net" },
]
description = "Simple demo"
readme = "README.md"
license = { file="LICENSE.txt" }
requires-python = ">=3.8"
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"Programming Language :: C",
]
Код: Выделить всё
setup.pyКод: Выделить всё
from setuptools import setup, Extension
import os.path
kwargs = dict(
# more metadata
ext_modules=[
Extension('empty.ext', [os.path.join('empty', 'ext.c')],
py_limited_api=True,
)]
)
setup(**kwargs)
Код: Выделить всё
ext.cКод: Выделить всё
#define Py_LIMITED_API 0x03070000
#define PY_SSIZE_T_CLEAN
#include
#include
// The module object
static PyObject* mod = NULL;
/*
* Documentation for _rbtree.
*/
PyDoc_STRVAR(ext_doc, "Minimal extension module");
static PyObject *say_hello(PyObject *mod, PyObject *args) {
return PyUnicode_FromString("Hello !");
}
PyMethodDef methods[] = {
{"hello", &say_hello, METH_NOARGS, PyDoc_STR("Simple function")},
{NULL},
};
static PyModuleDef ext_def = {
PyModuleDef_HEAD_INIT,
"ext",
ext_doc,
-1, /* m_size */
.m_methods=methods,
};
PyMODINIT_FUNC PyInit_ext() {
mod = PyModule_Create(&ext_def);
return mod;
}
Текущее исследование
Я не смог найти ничего о колесах abi3 ни в документации по сборке, ни в Руководстве пользователя по упаковке Python, где документирована только упаковка сборки с пометкой версии.
Обходные пути
- Я мог бы создать ожидаемые колеса, вручную распаковав версию с тегом «wheel» (), изменив его файл RECORD и упаковав его обратно (
Код: Выделить всё
wheel unpack ...whl)Код: Выделить всё
wheel pack ... - Возврат к старому доброму решению python setup.py ... позволяет напрямую создавать правильно помеченные теги. колесо, но боюсь, что оно уже устарело, если не устарело...
Подробнее здесь: https://stackoverflow.com/questions/734 ... ld-package
Мобильная версия