2011-08-25 103 views
5

我想在我的python應用程序中使用C++庫。我可以在python中加載dll,但找不到解決方案,如何創建該C++ dll中的類的實例並調用該onject上的方法。創建一個C++類的實例並在Python中調用它的方法

下面是我做的和想

C++代碼裏面My.dll

class MyClass 
{ 
    public: 
    MyMethod(int param); 
} 

Python代碼

from ctypes import * 
myDll = windll.LoadLibrary("My.dll") 

我想要做以下

myClassInstance = myDll.InstantiateMyClass() 
myClassInstance.MyMethod(5) 
+1

你應該看看Boost :: Python –

+0

你甚至不能這樣做混合不同的C++編譯器,從來沒有一種不同的語言。 [聽@CatPlusPlus並用Python類型編寫一個完整的Python擴展。](http://stackoverflow.com/questions/7196118/creating-an-instance-of-ac-class-and-calling-methods-on在python/7196380#7196380) –

回答

5

雖然它可能可能與ctypes,它肯定不會那麼簡單。它會更容易使用,例如Boost.PythonCython創建一個適當的CPython擴展,將該類公開爲Python類型。

1

用Ctypes加載C++ dll是很危險的,並且有一些很強的限制。導出的函數名稱與您聲明的不同,除非您在C++中將函數聲明爲「extern」C「'。這隻適用於純函數,而不適用於成員函數。 C++編譯器會執行一些名爲「name mangling」的操作,請參閱http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_C.2B.2B

我建議兩種解決方案:

  1. 你寫純函數聲明爲「外部‘C’」,這會使您所需要的功能,一些C++代碼。
  2. 我真的推薦使用Cython http://cython.org/,特別是http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html應該可以幫到你。我用了很多,對我來說,這是將C++代碼封裝到Python的最佳方式。

其他注意事項:

我試圖提振蟒蛇一些時間,但發現很難使用。它有自己的構建系統,你必須學習,編譯過程非常慢,並且由於模板語法,代碼難以閱讀。它背後的背景是非常酷的,但在我看來很難使用。

我也嘗試過SIP和SWIG,但我感覺不太舒服。

我真的推薦使用Cython。

+0

你的意思是「python」的第一行嗎?我很困惑爲什麼你說cython是危險和有限的,然後在(2)中推薦它。 (我對此一無所知......) –

+0

修正了它。現在它是ctypes。 – rocksportrocker

相關問題