在 python setuptools 中混合 cython 和 cmake 扩展

Mix cython and cmake extensions in python setuptools

我有一个 python 包,其中包含以下内容 setup.py:

from setuptools import setup, Extension
from setuptools.command.build_ext import build_ext


class CMakeExtension(Extension):
    # ...


class CMakeBuild(build_ext):
    # ...


extensions = [
    CMakeExtension("cmake_extension", "path-to-sources"),
    Extension("cython_extension", ["file.pyx"]),
]


setup(
    # ...
    ext_modules=extensions,
    # ...
)

我想知道我是否可以调用 python setup.py build_ext --inplace 并使用适当的构建器构建每个扩展。

我知道 cmdclass 设置函数参数,但没有找到指定 build_ext 应该用于 cython 扩展和 CMakeBuild 用于 cmake 扩展的方法。

请注意,使用正确的构建器 class(以及 cmdclass 参数),每个扩展都可以正常构建。

谢谢!

您最好的办法是确保 CMakeBuild 检测到扩展的类型并在扩展不是 CMakeExtension.[=13= 的实例时恢复为原始 build_ext ]

我找到的解决方法:

from setuptools import setup, Extension
from setuptools.command.build_ext import build_ext


class CMakeExtension(Extension):
    # ...


class CMakeBuild(build_ext):
    # ...


if sys.argv[1] == "build_ext":
    c_ext = [Extension(...)]
elif sys.argv[1] == "build_cmk":
    c_ext = [CMakeExtension(...)]
else:
    raise NotImplementedError


setup(
    # ...
    ext_modules=cythonize(c_ext),
    cmdclass={"build_ext": build_ext, "build_cmk": CMakeBuild},
    # ...
)

然后运行:

python setup.py build_ext --inplace
python setup.py build_cmk --inplace