在 C++ 中嵌入 Cython

Posted

技术标签:

【中文标题】在 C++ 中嵌入 Cython【英文标题】:Embedding Cython in C++ 【发布时间】:2015-05-06 14:08:22 【问题描述】:

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

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

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 嵌入,但这正是我让它工作的方式。

如果有人对此有任何见解,将不胜感激。

【问题讨论】:

【参考方案1】:

Cython 不能使 Python 代码独立于 Python;它调用 Python 库以处理 Python 类型和函数调用。如果您希望您的程序独立于 Python,那么您不应该编写任何 Python 代码。

【讨论】:

好的,那就差不多了。感谢您的快速回答。 那不是真的,考虑这个链接:github.com/cython/cython/tree/master/Demos/embed @spacegoing:你确实注意到它链接到 Python 库,对吧?【参考方案2】:

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

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

但是,一旦您在代码中执行 import,您要么必须捆绑相关模块,要么确保它(以及它导入的任何东西!) 是使用 Cython 编译的。除非您正在做一些非常琐碎的事情,否则您可能会花费大量时间来追逐依赖关系。这包括大部分标准库。

【讨论】:

以上是关于在 C++ 中嵌入 Cython的主要内容,如果未能解决你的问题,请参考以下文章

在 Cython 中使用 C++ STL 映射

在 cython 的循环中创建 c++ 映射

如何在 Cython 中返回新的 C++ 对象?

Cython 中的 C++ 指针

在 ipython 中使用 Cython 包装 C++ 标准库

如何在 Cython 中正确管理 C++ 对象的生命周期?