在C++中嵌入Cython

3
我正在尝试将一段Cython代码嵌入到C++项目中,以便我可以编译一个二进制文件,该文件不依赖于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++代码中。

问题是Python有许多依赖项,无论是在编译过程中(例如在test.h中)还是在链接过程中。归根结底,在运行可执行文件时必须安装Python(否则会出现缺少python27.dll的错误)。

我这种方法是否正确?有很多选项让我感到非常困惑。从概念上讲,如果我希望整个项目与Python无关,那么为什么我需要调用Py_Initialize()呢?此外,这显然是`非常高级嵌入`方法而不是低级的Cython嵌入,但这只是我让它工作的方式。

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

2个回答

2
Cython 无法使 Python 代码与 Python 独立,它需要调用 Python 库来处理 Python 类型和函数调用。如果您希望程序与 Python 无关,则不应编写任何 Python 代码。

好的,那就差不多解决了。感谢您的快速回答。 - pansen
1
这不是真的,请考虑这个链接:https://github.com/cython/cython/tree/master/Demos/embed - spacegoing
1
@spacegoing:你有注意到它链接了Python库,对吧? - Ignacio Vazquez-Abrams

1

(这主要是对Ignacio Vazquez-Abrams's answer的补充说明,该答案指出您无法消除Python依赖关系)

如果您不想强制用户自己安装Python,则可以始终将python27.dll与应用程序捆绑在一起(阅读许可协议,但我几乎确定没有问题!)。

然而,一旦在代码中执行import,您必须捆绑相关模块,或确保它(以及任何导入它的内容!)已使用Cython编译。 除非您正在做一些非常琐碎的事情,否则您可能会花费很多时间追踪依赖项。 这包括大部分标准库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接