Как создавать расширения C с помощью поэзии?

Чтобы создать проект Python, управляемый с помощью poetry, мне нужно сначала создать расширения C (эквивалентно python setup.py build). poetry может сделать это в соответствии с этой ошибкой github. Но мне непонятно, что включать в pyproject.toml, чтобы сборка расширения C выполнялась при сборке с poetry build?


person thinwybk    schedule 05.02.2020    source источник
comment
По ссылке в вопросе добавьте build = 'build.py' к [tool.poetry] из pyproject.toml. Отредактируйте вопрос, чтобы отобразить содержимое build.py и pyproject.toml.   -  person sinoroc    schedule 05.02.2020


Ответы (1)


Добавьте build.py в корень репозитория. Например. если у вас есть один каталог файлов заголовков и 2 исходных файла:

from distutils.command.build_ext import build_ext


ext_modules = [
    Extension("<module-path-imported-into-python>",
              include_dirs=["<header-file-directory>"],
              sources=["<source-file-0>", "<source-file-1>"],
             ),
]


class BuildFailed(Exception):
    pass


class ExtBuilder(build_ext):

    def run(self):
        try:
            build_ext.run(self)
        except (DistutilsPlatformError, FileNotFoundError):
            raise BuildFailed('File not found. Could not compile C extension.')

    def build_extension(self, ext):
        try:
            build_ext.build_extension(self, ext)
        except (CCompilerError, DistutilsExecError, DistutilsPlatformError, ValueError):
            raise BuildFailed('Could not compile C extension.')


def build(setup_kwargs):
    """
    This function is mandatory in order to build the extensions.
    """
    setup_kwargs.update(
        {"ext_modules": ext_modules, "cmdclass": {"build_ext": ExtBuilder}}
    )

Добавить к pyproject.toml:

[tool.poetry]
build = "build.py"

Чтобы построить расширение, выполните poetry build.

Пример см. в этом PR.

person thinwybk    schedule 11.02.2020
comment
Хочу отметить, что build.py — это нестабильная функция, которая может быть заменена более сложной системой сборки для C-расширений: github.com/python-poetry/poetry/issues/2740 - person Padix Key; 25.11.2020