python 使用pyproject.toml生成cython扩展

hjzp0vay  于 2023-02-21  发布在  Python
关注(0)|答案(1)|浏览(185)

随着迁移到新的pyproject.toml系统,我想知道是否有一种方法可以在编译扩展时以可编辑模式安装包(pip install -e .没有这样做)。
所以我希望pip:

  • 运行我为Cython配置的build_ext并生成我的.so文件
  • 把它们放到本地文件夹中
  • 执行正常可编辑安装的其余步骤

我在pip文档中找到了一些关于build_wheel_for_editable的内容,但是我找不到任何实际的例子来说明这个钩子应该在哪里实现以及它应该是什么样子的(老实说,我甚至不完全确定这是我要找的)。
那么有人知道如何做到这一点吗?我也很高兴听到任何额外的解释,为什么pip install .运行build_ext,但编辑命令不运行。
详情:
我不再有setup.py文件;这pyproject.toml使用setuptools并且包含

[build-system]
requires = ["setuptools>=61.0", "numpy>=1.17", "cython>=0.18"]
build-backend = "setuptools.build_meta"

[tool.setuptools]
package-dir = {"" = "."}

[tool.setuptools.packages]
find = {}

[tool.setuptools.cmdclass]
build_ext = "_custom_build.build_ext"

定制的build_ext如下所示

from setuptools import Extension
from setuptools.command.build_ext import build_ext as _build_ext

from Cython.Build import cythonize

class build_ext(_build_ext):

    def initialize_options(self):
        super().initialize_options()
        if self.distribution.ext_modules is None:
            self.distribution.ext_modules = []
        extensions = Extension(...)
        self.distribution.ext_modules.extend(cythonize(extensions))

    def build_extensions(self):
        ...
        super().build_extensions()

它将. pyx构建到. cpp中,然后将它与另一个cpp一起添加到. so中。

iszxjhcz

iszxjhcz1#

我创建了一个如下所示的模块:

$  tree .   
.
├── pyproject.toml
├── setup.py
└── test
    └── helloworld.pyx

1 directory, 3 files

我的pyproject.toml看起来像:

[build-system]
requires = ["setuptools>=61.0", "numpy>=1.17", "cython>=0.18"]
build-backend = "setuptools.build_meta"

[tool.setuptools]
py-modules = ["test"]

[project]
name        = "test"
version     = "0.0.1"%

我的setup.py:

from setuptools import setup
from Cython.Build import cythonize

setup(ext_modules=cythonize("test/helloworld.pyx"))

helloworld.pyx只包含print("Hello world")
当我执行pip install -e .时,它按预期构建了cython文件。
如果你真的不想有一个setup.py,我想你需要覆盖build_py而不是build_ext,但是IMO仅仅有一个简单的setup.py文件并没有什么大不了的。

相关问题