在C ++中嵌入Cython

时间:2015-05-06 14:08:22

标签: python c++ cython

我试图在C ++项目中嵌入一段Cython代码,这样我就可以编译一个不依赖于Python 2.7的二进制文件(这样用户就可以在不安装Python的情况下运行可执行文件)。 Cython源代码不是纯Cython:那里还有Python代码。

我正在使用以下脚本中的distutils编译我的Cython代码(setup.py):

from distutils.core import setup
from Cython.Build import cythonize

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

然后我使用python setup.py build_ext --inplace运行脚本。这会生成几个文件:test.ctest.htest.pyd和一些库文件:test.exptest.objtest.lib

将其导入C ++的正确步骤是什么?我设法通过在编译期间包含test.ctest.h以及在链接期间test.lib来实现它。

然后我可以在发出

之后调用Cython函数
Py_Initialize();
inittest();

在我的C ++代码中。

问题在于,在编译期间(例如,在test.h中)以及链接期间,都存在大量的Python依赖性。最重要的是,为了运行可执行文件,必须安装Python(否则我会在丢失python27.dll时出错。)

我是否采用这种方法朝着正确的方向前进?有很多选择,我对如何进行非常困惑。从概念上讲,如果我希望整个事情与Python无关,那么为什么我应该调用Py_Initialize()也没有意义。此外,这显然是`Very High Level Embedding' method而不是低级Cython嵌入,但这就是我如何使用它。

如果有人对此有任何见解,那将非常感激。

2 个答案:

答案 0 :(得分:2)

Cython无法使Python代码与Python无关;它调用Python库来处理Python类型和函数调用。如果您希望您的程序与Python无关,那么您就不应该编写任何Python代码。

答案 1 :(得分:1)

(这主要是额外的细节 Ignacio Vazquez-Abrams's answer表示你无法消除Python依赖关系)

如果您不想强迫用户自己安装Python,您可以随时将python27.dll与您的应用程序捆绑在一起(阅读许可协议,但我几乎可以肯定它没问题!)。

但是,只要在代码中执行import,就必须捆绑相关模块,或者确保(以及导入的任何内容!)编译为用Cython。除非你做的事情非常微不足道,否则你可能会花费大量时间来追逐依赖关系。这包括大部分标准库。