[英]Embed C++ code into Python with Ctypes (SpecialKEval)
我正在寫一個Python應用程序,我需要能夠調用C ++函數getRankOfSeven
從文件SevenEval.cpp
從項目SpecialKEval 。 出於明顯的性能原因,我必須運行SpecialKEval的C ++版本而不是python版本,因為我的應用程序的要點是蒙特卡羅模擬,該模擬計算獲勝概率。
我已經編譯了這些文件:
g++ -o SevenEval.so -shared -fPIC FiveEval.cpp SevenEval.cpp
並將輸出導入到Python:
from ctypes import cdll
se = cdll.LoadLibrary('./SevenEval.so')
加載沒有問題,但是se.SevenEval()
拋出AttributeError: ./SevenEval.so: undefined symbol: SevenEval
我已經讀過,為了使ctypes工作,我需要C對象/函數而不是C ++對象/函數,並且用extrect "C" {
將它們包裝起來,但是我不知道任何C / C ++(I僅使用Python編寫的代碼),因此我不知道該怎么做,這些示例太簡單了,無法適應我的問題。
在詢問之前,我已經搜索了很多東西,也許解決方案就在那里,但是由於我的C / C ++級別較低,所以我不知道該怎么做。 如果有人可以給我一些指導,詳細的例子,或者為我做這件事,我將非常高興。
注意:在Ubuntu 13.10 64位,Python2.7上運行
在Smoothware注釋后編輯。
好的,這是在SevenEval.h上的函數聲明: short getRankOfSeven(const int CARD1, const int CARD2, const int CARD3, const int CARD4, const int CARD5, const int CARD6, const int CARD7);
這就是我在文件末尾添加的內容:
extern "C" {
SevenEval* SevenEval_new(){ return new SevenEval(); }
short SevenEval_getRankOfSeven(SevenEval* foo, const int CARD1, const int CARD2, const int CARD3, const int CARD4, const int CARD5, const int CARD6, const int CARD7){ foo->getRankOfSeven(CARD1, CARD2, CARD3, CARD4, CARD5, CARD6, CARD7);}
}
這是我的Python文件:
from ctypes import cdll
lib = cdll.LoadLibrary('./SevenEval.so')
class SevenEval(object):
def __init__(self):
self.obj = lib.SevenEval_new()
def getRankOfSeven(self, c1, c2, c3, c4, c5, c6, c7):
lib.SevenEval_getRankOfSeven(self.obj, c1, c2, c3, c4, c5, c6, c7)
se = SevenEval() # Runs OK
print se.getRankOfSeven(1,2,3,4,5,6,7) # Gives Segmentation fault (core dumped)
我做錯了什么?
上次編輯中的解決方案適用於32位Python。 對於64位:
from ctypes import cdll
from ctypes import c_void_p
lib = cdll.LoadLibrary('./SevenEval.so')
lib.SevenEval_new.restype = c_void_p
class SevenEval(object):
def __init__(self):
self.obj = c_void_p(lib.SevenEval_new())
def getRankOfSeven(self, c1, c2, c3, c4, c5, c6, c7):
return lib.SevenEval_getRankOfSeven(\
self.obj, c1, c2, c3, c4, c5, c6, c7)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.