我可以使用cython创建一个包含python代码作为核心的导出C函数的共享库吗?就像用C ??
包装Python一样它将用于插件。 TK
答案 0 :(得分:2)
使用Cython,您可以使用cdef
关键字(和public
... important!)编写声明为C的函数,并使用Python内部代码:
<强> yourext.pyx 强>
cdef int public func1(unsigned long l, float f):
print(f) # some python code
注意:在下面假设我们正在驱动器D的根目录中工作:\
构建(setup.py)
from distutils.core import setup
from Cython.Distutils import build_ext
setup(
cmdclass = {'build_ext': build_ext},
name = 'My app',
ext_modules = cythonize("yourext.pyx"),
)
然后运行python setup.py build_ext --inplace
运行setup.py后(如果您使用的是distutils
),您将获得2个感兴趣的文件:
调查.c
最后会向您显示func1
是一个C函数。
这两个文件都是我们需要完成的。
C主要测试程序
// test.c
#include "Python.h"
#include "yourext.h"
main()
{
Py_Initialize(); // start python interpreter
inityourext(); // run module yourext
func1(12, 3.0); // Lets use shared library...
Py_Finalize();
}
由于我们本身不使用扩展名(.pyd
),我们需要在头文件中制作一个小技巧/黑客来禁用“DLL行为”。在“yourext.h”的开头添加以下内容:
#undef DL_IMPORT # Undefines DL_IMPORT macro
#define DL_IMPORT(t) t # Redefines it to do nothing...
__PYX_EXTERN_C DL_IMPORT(int) func1(unsigned long, float);
将“yourext”编译为共享库
gcc -shared yourext.c -IC:\Python27\include -LC:\Python27\libs -lpython27 -o libyourext.dll
然后编译我们的测试程序(链接到DLL)
gcc test.c -IC:\Python27\include -LC:\Python27\libs -LD:\ -lpython27 -lyourext -o test.exe
最后,运行程序
$ test
3.0
这不是很明显,还有很多其他方法可以实现同样的目的,但这有效(看看boost::python,......,其他解决方案可能更适合您的需求)。
我希望这回答你的问题,或者至少给你一个想法......