创建一个暴露python代码的DLL

时间:2013-12-08 21:01:50

标签: python c plugins cython

我可以使用cython创建一个包含python代码作为核心的导出C函数的共享库吗?就像用C ??

包装Python一样

它将用于插件。 TK

1 个答案:

答案 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个感兴趣的文件:

  • yourext.h
  • yourext.c

调查.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,......,其他解决方案可能更适合您的需求)。

我希望这回答你的问题,或者至少给你一个想法......