python调用c++ ctype list传数组或者返回数组的方法


Posted in Python onFebruary 13, 2019

示例1:

pycallclass.cpp:

#include <iostream>
using namespace std;
typedef unsigned char BYTE;
#define MAX_COUNT 20
 
struct tagOutCardResult_py
{
	BYTE							cbCardCount;					
	BYTE							cbResultCard1;
	BYTE							cbResultCard2;
	BYTE							cbResultCard3;
	BYTE							cbResultCard4;
	BYTE							cbResultCard5;
	BYTE							cbResultCard6;
	BYTE							cbResultCard7;
	BYTE							cbResultCard8;
	BYTE							cbResultCard9;
	BYTE							cbResultCard10;
	BYTE							cbResultCard11;
	BYTE							cbResultCard12;
	BYTE							cbResultCard13;
	BYTE							cbResultCard14;
	BYTE							cbResultCard15;
	BYTE							cbResultCard16;
	BYTE							cbResultCard17;
	BYTE							cbResultCard18;
	BYTE							cbResultCard19;
	BYTE							cbResultCard20;
};
 
struct tagOutCardResult
{
	BYTE							cbCardCount;					
	BYTE							cbResultCard[MAX_COUNT];		
	void clear()
	{
		cbCardCount = 0;
		for (int nIdx = 0;nIdx < MAX_COUNT;++nIdx)
		{
			cbResultCard[nIdx] = 0;
		}
	}	
	void topy(tagOutCardResult_py* ppy)
	{
		cout<<"topy function begin"<<endl;
		ppy->cbCardCount = cbCardCount;
		cout<<"topy function 1"<<endl;
		ppy->cbResultCard1 = cbResultCard[1 - 1];
		cout<<"topy function 2"<<endl;
		ppy->cbResultCard2 = cbResultCard[2 - 1];
		ppy->cbResultCard3 = cbResultCard[3 - 1];
		ppy->cbResultCard4 = cbResultCard[4 - 1];
		ppy->cbResultCard5 = cbResultCard[5 - 1];
		ppy->cbResultCard6 = cbResultCard[6 - 1];
		ppy->cbResultCard7 = cbResultCard[7 - 1];
		ppy->cbResultCard8 = cbResultCard[8 - 1];
		ppy->cbResultCard9 = cbResultCard[9 - 1];
		ppy->cbResultCard10 = cbResultCard[10 - 1];
		ppy->cbResultCard11 = cbResultCard[11 - 1];
		ppy->cbResultCard12 = cbResultCard[12 - 1];
		ppy->cbResultCard13 = cbResultCard[13 - 1];
		ppy->cbResultCard14 = cbResultCard[14 - 1];
		ppy->cbResultCard15 = cbResultCard[15 - 1];
		ppy->cbResultCard16 = cbResultCard[16 - 1];
		ppy->cbResultCard17 = cbResultCard[17 - 1];
		ppy->cbResultCard18 = cbResultCard[18 - 1];
		ppy->cbResultCard19 = cbResultCard[19 - 1];
		ppy->cbResultCard20 = cbResultCard[20 - 1];
		cout<<"topy function end"<<endl;
	}
};
 
class TestLib
{
	public:
		void display(tagOutCardResult& ret);
};
void TestLib::display(tagOutCardResult& ret) {
	ret.cbCardCount = 3;
	ret.cbResultCard[0] = 1;
	ret.cbResultCard[1] = 50;
	ret.cbResultCard[2] = 100;
 
	cout<<"First display aaa ";
	cout<<"hello ";
	cout<<"world ";
}
 
extern "C" {
	TestLib oGameLogic;
	void display(tagOutCardResult_py* ret_py) {
		tagOutCardResult oRet;
		oGameLogic.display(oRet);
		cout<<"before topy"<<endl;
		oRet.topy(ret_py);
		cout<<"after topy"<<endl;
		cout<<"in cpp:ret_py->cbCardCount:"<<ret_py->cbCardCount<<endl;
		cout<<"in cpp:ret_py->cbResultCard1:"<<ret_py->cbResultCard1<<endl;
		cout<<" this:" << ret_py << endl;
	}
}

编译脚本:

g++ -o libpycallclass.so -shared -fPIC pycallclass.cpp -I/usr/include/python2.6 -L/usr/lib64/python2.6/config

Game.py调用部分。类声明:

import ctypes
 
class tagOutCardResult_py(ctypes.Structure):
 _fields_ = [("cbCardCount", ctypes.c_ubyte), \
("cbResultCard1", ctypes.c_ubyte), \
("cbResultCard2", ctypes.c_ubyte), \
("cbResultCard3", ctypes.c_ubyte), \
("cbResultCard4", ctypes.c_ubyte), \
("cbResultCard5", ctypes.c_ubyte), \
("cbResultCard6", ctypes.c_ubyte), \
("cbResultCard7", ctypes.c_ubyte), \
("cbResultCard8", ctypes.c_ubyte), \
("cbResultCard9", ctypes.c_ubyte), \
("cbResultCard10", ctypes.c_ubyte), \
("cbResultCard11", ctypes.c_ubyte), \
("cbResultCard12", ctypes.c_ubyte), \
("cbResultCard13", ctypes.c_ubyte), \
("cbResultCard14", ctypes.c_ubyte), \
("cbResultCard15", ctypes.c_ubyte), \
("cbResultCard16", ctypes.c_ubyte), \
("cbResultCard17", ctypes.c_ubyte), \
("cbResultCard18", ctypes.c_ubyte), \
("cbResultCard19", ctypes.c_ubyte), \
("cbResultCard20", ctypes.c_ubyte)]

Game.py调用部分。具体调用:

import ctypes
  so = ctypes.cdll.LoadLibrary
  lib = so("./libpycallclass.so")
  ERROR_MSG('display(\)')
  ret = tagOutCardResult_py(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
  ERROR_MSG("before lib.display(ctypes.byref(ret))")
  lib.display(ctypes.byref(ret))
  ERROR_MSG("after lib.display(ctypes.byref(ret))")
  ERROR_MSG('#######################################################################################')
  ERROR_MSG(ret)
  ERROR_MSG(ret.cbCardCount)
  ERROR_MSG(ret.cbResultCard1)
  ERROR_MSG(ret.cbResultCard2)
  ERROR_MSG(ret.cbResultCard3)
  ERROR_MSG(type(ret))

传入一个结构体,使用引用返回,回到python中打印出来结果是对的。

这样就可以传入,可以传出了。

示例1end#########################################################################

示例2:

pycallclass.cpp:

#include <iostream>
using namespace std;
typedef unsigned char BYTE;
#define MAX_COUNT 20
 
#if defined(WIN32)||defined(WINDOWS)
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT
#endif
 
struct ByteArray_20
{
	BYTE e1;
	BYTE e2;
	BYTE e3;
	BYTE e4;
	BYTE e5;
	BYTE e6;
	BYTE e7;
	BYTE e8;
	BYTE e9;
	BYTE e10;
	BYTE e11;
	BYTE e12;
	BYTE e13;
	BYTE e14;
	BYTE e15;
	BYTE e16;
	BYTE e17;
	BYTE e18;
	BYTE e19;
	BYTE e20;
};
struct ByteArray_20_3
{
	ByteArray_20 e1;
	ByteArray_20 e2;
	ByteArray_20 e3;
};
 
struct ByteArrayNew_20_3
{
	BYTE e[3][20];
};
 
class TestLib
{
	public:
		void LogicFunc(ByteArray_20_3& ret);
		void LogicFuncNew(ByteArrayNew_20_3& ret);
};
void TestLib::LogicFunc(ByteArray_20_3& ret) {
	ret.e1.e1 = 3;
	ret.e1.e2 = 1;
	ret.e1.e3 = 50;
	ret.e2.e1 = 100;
	ret.e2.e2 = 200;
	ret.e2.e3 = 20;
 
	cout<<"TestLib::LogicFunc"<<endl;
}
void TestLib::LogicFuncNew(ByteArrayNew_20_3& ret) {
	ret.e[0][0] = 31;
	ret.e[0][1] = 11;
	ret.e[0][2] = 51;
	ret.e[1][0] = 101;
	ret.e[1][1] = 201;
	ret.e[1][2] = 21;
 
	cout << "TestLib::LogicFuncNew" << endl;
}
 
extern "C" {
	TestLib oGameLogic;
	void DLL_EXPORT display(ByteArray_20_3* pret) {
		cout<<"cpp display func begin"<<endl;
		oGameLogic.LogicFunc(*pret);
		cout<<"cpp display func end"<<endl;
	}
	void DLL_EXPORT display2(ByteArrayNew_20_3* pret) {
		cout << "cpp display2 func begin" << endl;
		oGameLogic.LogicFuncNew(*pret);
		cout << "cpp display2 func end" << endl;
	}
}

pycallclass.py:

import ctypes
 
def ERROR_MSG(str):
 print str
 
class ByteArray_20(ctypes.Structure):
 _fields_ = [\
("e1", ctypes.c_ubyte), \
("e2", ctypes.c_ubyte), \
("e3", ctypes.c_ubyte), \
("e4", ctypes.c_ubyte), \
("e5", ctypes.c_ubyte), \
("e6", ctypes.c_ubyte), \
("e7", ctypes.c_ubyte), \
("e8", ctypes.c_ubyte), \
("e9", ctypes.c_ubyte), \
("e10", ctypes.c_ubyte), \
("e11", ctypes.c_ubyte), \
("e12", ctypes.c_ubyte), \
("e13", ctypes.c_ubyte), \
("e14", ctypes.c_ubyte), \
("e15", ctypes.c_ubyte), \
("e16", ctypes.c_ubyte), \
("e17", ctypes.c_ubyte), \
("e18", ctypes.c_ubyte), \
("e19", ctypes.c_ubyte), \
("e20", ctypes.c_ubyte)]
 
 
class ByteArray_20_3(ctypes.Structure):
 _fields_ = [\
("e1", ByteArray_20), \
("e2", ByteArray_20), \
("e3", ByteArray_20)]
 def __init__(self):
  self.aaa = 123
  self.bbb = [1, 2, 3, 4, 5]
  self.ccc = "alksdfjlasdfjk"
 def test(self):
  self.aaa = 123
  self.bbb = [1, 2, 3, 4, 5]
  self.ccc = "alksdfjlasdfjk"
  self.e1.e1 = 5
  self.e1.e2 = 20
 
 
so = ctypes.cdll.LoadLibrary
lib = so("./libpycallclass.dll")
print('display()')
ret = ByteArray_20_3()
ret.test()
ERROR_MSG(ret.e1.e1)
ERROR_MSG(ret.e1.e2)
print("before lib.display(ctypes.byref(ret))")
lib.display(ctypes.byref(ret))
print("after lib.display(ctypes.byref(ret))")
print('#######################################################################################')
print(ret)
ERROR_MSG(ret.e1)
ERROR_MSG(ret.e2)
ERROR_MSG(ret.e3)
ERROR_MSG(ret.e1.e1)
ERROR_MSG(ret.e1.e2)
ERROR_MSG(ret.e1.e3)
ERROR_MSG(ret.e2.e1)
ERROR_MSG(ret.e2.e2)
ERROR_MSG(ret.e2.e3)
ERROR_MSG(type(ret))
 
print("before lib.display2(ctypes.byref(ret))")
lib.display2(ctypes.byref(ret))
print("after lib.display2(ctypes.byref(ret))")
print('#######################################################################################')
print(ret)
ERROR_MSG(ret.e1)
ERROR_MSG(ret.e2)
ERROR_MSG(ret.e3)
ERROR_MSG(ret.e1.e1)
ERROR_MSG(ret.e1.e2)
ERROR_MSG(ret.e1.e3)
ERROR_MSG(ret.e2.e1)
ERROR_MSG(ret.e2.e2)
ERROR_MSG(ret.e2.e3)
ERROR_MSG(type(ret))
 
ret.test()
ERROR_MSG(ret.e1.e1)
ERROR_MSG(ret.e1.e2)

g++:

g++ -o libpycallclass.so -shared -fPIC pycallclass.cpp -I/usr/include/python2.6 -L/usr/lib64/python2.6/config

windows:

新建一个DLL工程,把pycallclass.cpp加进去,编译成DLL就OK了。

千万注意python的运行时是32位的还是64位的,DLL或者SO必须和它对应。

python类可以嵌套使用,继承ctypes.Structure,部分成员是_fields_里定义的,部分成员在__init__里定义,这样的类也可以ctypes.byref(self)传进c++去,传的是指针,传入传出就都OK了。

注意示例2中ByteArrayNew_20_3的用法,python中是定义了20个变量,c++中是直接一个二维数组。内存结构是一致的,所以可以直接这样使用。注意类型和长度必须一致,否则可能会内存访问越界。

以上这篇python调用c++ ctype list传数组或者返回数组的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基于隐马尔可夫模型实现中文拼音输入
Apr 01 Python
Python AES加密模块用法分析
May 22 Python
解决python文件字符串转列表时遇到空行的问题
Jul 09 Python
python计算列表内各元素的个数实例
Jun 29 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
Sep 27 Python
Python3实现腾讯云OCR识别
Nov 27 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
浅析PyTorch中nn.Linear的使用
Aug 18 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
Python grpc超时机制代码示例
Sep 14 Python
Pytorch数据读取之Dataset和DataLoader知识总结
May 23 Python
python 爬取哔哩哔哩up主信息和投稿视频
Jun 07 Python
python调用c++传递数组的实例
Feb 13 #Python
利用ctypes获取numpy数组的指针方法
Feb 12 #Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 #Python
使用python绘制二元函数图像的实例
Feb 12 #Python
python matplotlib实现双Y轴的实例
Feb 12 #Python
对Pycharm创建py文件时自定义头部模板的方法详解
Feb 12 #Python
numpy基础教程之np.linalg
Feb 12 #Python
You might like
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
Aster vs KG BO3 第二场2.18
2021/03/10 DOTA
ext读取两种结构的xml的代码
2008/11/05 Javascript
jquery 最简单的属性菜单
2009/10/08 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
javascript截取字符串小结
2015/04/28 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
使用JavaScript实现alert的实例代码
2017/07/06 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
vue + element-ui的分页问题实现
2018/12/17 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
2020/04/08 Javascript
python列表操作之extend和append的区别实例分析
2015/07/28 Python
python递归实现快速排序
2018/08/18 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
澳大利亚玩具剧场:Toy Playhouse
2019/03/03 全球购物
中学生校园广播稿
2014/01/16 职场文书
优秀求职信范文分享
2014/01/26 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
消费者投诉书范文
2015/07/02 职场文书
Python绘制散乱的点构成的图的方法
2022/04/21 Python
MySQL普通表如何转换成分区表
2022/05/30 MySQL
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL
ubuntu开机后ROS程序自启动问题
2022/12/24 Servers