2014-10-31 60 views
1

我的C++程序:我如何從python獲得C++結構?

#include <iostream> 

using namespace std; 

struct FirstStructure 
{ 
public: 
    int first_int; 
    int second_int; 
}; 

struct SecondStructure 
{ 
public: 
    int third_int; 
    FirstStructure ft; 
}; 

int test_structure(SecondStructure ss) 
{ 
    int sum = ss.ft.first_int + ss.ft.second_int + ss.third_int; 
    return sum; 
} 

extern "C" 
{ 
    int test(SecondStructure ss) 
    { 
     return test_structure(ss); 
    } 
} 

我編譯cpp文件使用此命令的 「g ++ -shared -fPIC -o array.so array.cpp」。 然後我調用該文件array.so使用Python,我的Python程序,因爲這些:

#coding=utf-8 

import ctypes 
from ctypes import * 


class FirstStructure(Structure): 
    _fields_ = [ 
     ("first_int", c_int), 
     ("second_int", c_int) 
    ] 


class SecondStructure(Structure): 
    _fields_ = [ 
     ("third_int", c_int), 
     ("ft", FirstStructure) 
    ] 


if __name__ == '__main__': 
    fs = FirstStructure(1, 2) 
    ss = SecondStructure(3, fs) 
    print ss.ft.first_int 
    lib = ctypes.CDLL("./array.so") 
    print lib.test(ss) 

當我運行Python程序,控制檯顯示錯誤,錯誤是「分段錯誤」。我閱讀文檔從URL「https://docs.python.org/2/library/ctypes.html」,如何修復該錯誤。

+0

雖然在Windows上我拷貝了代碼,除了向'test'函數中添加'__declspec(dllexport)'並加載.dll而不是.so而且它完美地工作,返回'1'和' 6'。 – 2014-11-01 05:27:34

回答

1

好吧,我知道了,修改後的代碼,因爲這些:

#include <iostream> 

using namespace std; 

extern "C" 
{ 
struct FirstStructure 
{ 
public: 
    int first_int; 
    int second_int; 
}; 

struct SecondStructure 
{ 
public: 
    int third_int; 
    FirstStructure ft; 
}; 

int test_structure(SecondStructure *ss) 
{ 
    int sum = ss->ft.first_int + ss->ft.second_int + ss->third_int; 
    return sum; 
} 
    int test(SecondStructure *ss) 
    { 
     return test_structure(ss); 
    } 
} 

,然後,我固定的bug。

0

那麼如果你打算在C++和python之間設計通信媒介,那麼我會建議去組合zmq和google協議緩衝區。

其中proto buf將用於序列化/反序列化和zmq用於通信媒介。

2

你必須在python中聲明一個函數的參數和返回類型,以便能夠正確地調用它。

所以,調用test函數之前插入以下內容:

lib.test.argtypes = [SecondStructure] 
lib.test.restype = ctypes.c_int 

事情應該工作,那麼,據我可以看到... ...

只要C-TO-量python接口仍然是「小」(不管那是什麼),我認爲​​就好。

+0

我再次遇到了錯誤。 – 2014-10-31 12:24:45