2013-12-08 33 views
2

我可以使用cython創建一個共享庫,其中包含以python代碼爲核心的導出C函數?像用C包裝Python?創建一個暴露python代碼的DLL

它是在插件中使用。 TK

+0

你在正確的軌道上提到Cython。挖掘它;)。 http://docs.cython.org/src/userguide/language_basics.html –

+0

您是否找到滿意的解決方案解決您的問題? –

回答

2

使用用Cython,你可以寫聲明爲與cdef關鍵字Ç那些功能,與Python內碼(和public ...重要!):

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,...,其他解決方案可以更好地滿足您的需求)。

我希望這回答有點你的問題,或者至少,給你一個想法...

+0

非常感謝詳盡的答案..我正在通過它。看起來不錯 –

+0

好的,請保持我們的發佈(即使您的最終解決方案不是Cython,我很感興趣!),並且如果您使用Cython獲得有趣的結果,請不要猶豫'回答您自己的問題。 –