Чтобы создать проект Python, управляемый с помощью poetry
, мне нужно сначала создать расширения C (эквивалентно python setup.py build
). poetry
может сделать это в соответствии с этой ошибкой github. Но мне непонятно, что включать в pyproject.toml
, чтобы сборка расширения C выполнялась при сборке с poetry build
?
Как создавать расширения C с помощью поэзии?
Ответы (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
Хочу отметить, что
build.py
— это нестабильная функция, которая может быть заменена более сложной системой сборки для C-расширений: github.com/python-poetry/poetry/issues/2740
- person Padix Key; 25.11.2020
build = 'build.py'
к[tool.poetry]
изpyproject.toml
. Отредактируйте вопрос, чтобы отобразить содержимоеbuild.py
иpyproject.toml
. - person sinoroc   schedule 05.02.2020