簡體   English   中英

使用Ctypes將C ++代碼嵌入Python(SpecialKEval)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM