如何从python中获得c ++中的结构?

时间:2014-10-31 09:33:39

标签: python c++ ctypes

我的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 ++ -fPIC -shared -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程序时,控制台显示错误,错误是“分段错误”。我从网址“https://docs.python.org/2/library/ctypes.html”阅读文档,如何修复错误。

4 个答案:

答案 0 :(得分:2)

你必须在python中声明一个函数的参数并返回类型,以便能够正确调用它。

因此,在调用test函数之前插入以下内容:

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

就我所知,事情应该有效......

只要C-to-python接口的数量保持“小”(无论是什么),我认为ctypes就好了。

答案 1 :(得分: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);
    }
}

然后,我修复了错误。

答案 2 :(得分:0)

如果您打算在C ++和python之间设计通信媒介,那么我建议去组合zmq和google协议缓冲区。

其中proto buf用于序列化/反序列化,zmq用于通信媒体。

答案 3 :(得分:0)

您可能想看看Boost.python

https://wiki.python.org/moin/boost.python/SimpleExample

它允许您从C ++编译python模块并定义如何以易于理解的方式访问python以获取c ++代码