在 C++ 中嵌入 Cython
Embedding Cython in C++
我正在尝试在 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.c
、test.h
、test.pyd
和一些库文件:test.exp
、test.obj
和 test.lib
.
将其导入 C++ 的正确步骤是什么?我设法通过在编译期间包括 test.c
和 test.h
以及在链接期间包括 test.lib
来使其工作。
然后我可以在发出后调用 Cython 函数
Py_Initialize();
inittest();
在我的 C++ 代码中。
问题在于,在编译期间(例如,在 test.h
中)以及链接期间,对 Python 存在大量依赖项。最重要的是,为了 运行 可执行文件,必须安装 Python (否则我会在缺少 python27.dll
时出错)。
我采用这种方法的方向是否正确?有太多选择,我只是对如何进行感到非常困惑。从概念上讲,如果我希望整个事情是 Python 独立的,为什么我应该调用 Py_Initialize()
也是没有意义的。此外,这显然是 `Very High Level Embedding' method 而不是低级 Cython 嵌入,但这正是我让它工作的方式。
如果有人对此有任何见解,那将不胜感激。
Cython 无法使 Python 代码 Python 独立;它调用 Python 库来处理 Python 类型和函数调用。如果您希望您的程序是 Python 独立的,那么您不应该编写任何 Python 代码。
(这主要是额外的细节
这表示您无法消除 Python 依赖项)
如果您不想强迫您的用户自己安装 Python,您可以随时将 python27.dll 与您的应用程序捆绑在一起(阅读许可协议,但我几乎可以肯定它是很好!)。
但是,一旦您在代码中执行 import
,您要么必须捆绑相关模块,要么确保它 (以及它导入的任何内容!) 是用 Cython 编译的。除非你正在做一些非常微不足道的事情,否则你可能会花费大量时间来追逐依赖关系。这包括大部分标准库。
我正在尝试在 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.c
、test.h
、test.pyd
和一些库文件:test.exp
、test.obj
和 test.lib
.
将其导入 C++ 的正确步骤是什么?我设法通过在编译期间包括 test.c
和 test.h
以及在链接期间包括 test.lib
来使其工作。
然后我可以在发出后调用 Cython 函数
Py_Initialize();
inittest();
在我的 C++ 代码中。
问题在于,在编译期间(例如,在 test.h
中)以及链接期间,对 Python 存在大量依赖项。最重要的是,为了 运行 可执行文件,必须安装 Python (否则我会在缺少 python27.dll
时出错)。
我采用这种方法的方向是否正确?有太多选择,我只是对如何进行感到非常困惑。从概念上讲,如果我希望整个事情是 Python 独立的,为什么我应该调用 Py_Initialize()
也是没有意义的。此外,这显然是 `Very High Level Embedding' method 而不是低级 Cython 嵌入,但这正是我让它工作的方式。
如果有人对此有任何见解,那将不胜感激。
Cython 无法使 Python 代码 Python 独立;它调用 Python 库来处理 Python 类型和函数调用。如果您希望您的程序是 Python 独立的,那么您不应该编写任何 Python 代码。
(这主要是额外的细节
如果您不想强迫您的用户自己安装 Python,您可以随时将 python27.dll 与您的应用程序捆绑在一起(阅读许可协议,但我几乎可以肯定它是很好!)。
但是,一旦您在代码中执行 import
,您要么必须捆绑相关模块,要么确保它 (以及它导入的任何内容!) 是用 Cython 编译的。除非你正在做一些非常微不足道的事情,否则你可能会花费大量时间来追逐依赖关系。这包括大部分标准库。