在 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
我有一个 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