我试图在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.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嵌入,但这就是我如何使用它。
如果有人对此有任何见解,那将非常感激。
答案 0 :(得分:2)
Cython无法使Python代码与Python无关;它调用Python库来处理Python类型和函数调用。如果您希望您的程序与Python无关,那么您就不应该编写任何Python代码。
答案 1 :(得分:1)
(这主要是额外的细节 Ignacio Vazquez-Abrams's answer表示你无法消除Python依赖关系)
如果您不想强迫用户自己安装Python,您可以随时将python27.dll与您的应用程序捆绑在一起(阅读许可协议,但我几乎可以肯定它没问题!)。
但是,只要在代码中执行import
,就必须捆绑相关模块,或者确保(以及导入的任何内容!)编译为用Cython。除非你做的事情非常微不足道,否则你可能会花费大量时间来追逐依赖关系。这包括大部分标准库。