我的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”阅读文档,如何修复错误。
答案 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 ++代码