我们有一堆C ++文件,包含使用Cython包装到Python的类。我们使用setuptools来构建Cython扩展。这一切都很好,我们按照这里的指南 http://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html
我们基本上是在做这样的事情
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(
"rect.pyx", # our Cython source
sources=["Rectangle.cpp"], # additional source file(s)
language="c++", # generate C++ code
))
我们不喜欢这个,我们必须重新编译所有内容,即使只有Cython部分更改,在此示例中为rect.pyx
。实际上,我们从不触及.cpp
文件,但经常更改.pyx
文件。
我们希望将.cpp
文件分别编译为静态或共享库,然后独立构建.pyx
文件,这些文件链接到从.cpp
文件生成的库。使用make
或cmake
这一切都很简单,但我们需要一个仅使用setuptools
的纯Python解决方案。模拟代码看起来像这样:
from distutils.core import setup
from Cython.Build import cythonize
class CppLibary:
# somehow get that to work
# this should only recompile cpplib when source files changed
cpplib = CppLibary('cpplib',
sources=["Rectangle.cpp"], # put static cpp code here
include_dirs=["include"])
setup(ext_modules = cythonize(
"rect.pyx", # our Cython source
libraries=[cpplib], # link to cpplib
language="c++", # generate C++ code
))
答案 0 :(得分:4)
setup
有一个看似无法记录的功能可以做到这一点,例如:
import os
from setuptools import setup
from Cython.Build import cythonize
ext_lib_path = 'rectangle'
include_dir = os.path.join(ext_lib_path, 'include')
sources = ['Rectangle.cpp']
# Use as macros = [('<DEFINITION>', '<VALUE>')]
# where value can be None
macros = None
ext_libraries = [['rectangle', {
'sources': [os.path.join(ext_lib_path, src) for src in sources],
'include_dirs': [include_dir],
'macros': macros,
}
]]
extensions = [Extension("rect",
sources=["rect.pyx"],
language="c++",
include_dirs=[include_dir],
libraries=['rectangle'],
)]
setup(ext_modules=cythonize(extensions),
libraries=ext_libraries)
libraries
参数构建目录rectangle
中的外部库,其中包含目录rectangle/include
与扩展名之间的共同点。
还将导入切换为setuptools
,distutils
已弃用,现已成为setuptools的一部分。
没有看到关于这个论点的任何文档,但看到它在其他项目中使用过。
这是未经测试的,请提供样本文件以供测试,如果它不起作用。