Как собрать стабильное колесо ABI из пакета сборки PEP517?Python

Программы на Python
Ответить
Anonymous
 Как собрать стабильное колесо ABI из пакета сборки PEP517?

Сообщение Anonymous »

Контекст
В настоящее время я разрабатываю пакет 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
но я не смог найти способ передать параметр py-limited-api для сборки
Текущая конфигурация для упрощенного примера

Код: Выделить всё

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)

Код: Выделить всё

#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;
}
и пустой файл __init__.py для объявления обычного пакета.
Текущее исследование
Я не смог найти ничего о колесах abi3 ни в документации по сборке, ни в Руководстве пользователя по упаковке Python, где документирована только упаковка сборки с пометкой версии.
Обходные пути
  • Я мог бы создать ожидаемые колеса, вручную распаковав версию с тегом «wheel» (

    Код: Выделить всё

    wheel unpack ...whl
    ), изменив его файл RECORD и упаковав его обратно (

    Код: Выделить всё

    wheel pack ...
    )
  • Возврат к старому доброму решению python setup.py ... позволяет напрямую создавать правильно помеченные теги. колесо, но боюсь, что оно уже устарело, если не устарело...


Подробнее здесь: https://stackoverflow.com/questions/734 ... ld-package
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»