详解python如何调用C/C++底层库与互相传值


Posted in Python onAugust 10, 2016

前言

开发环境:

Centos 7 + Python 3.5.1 + Qt Creator(只是使用Qt Creator编译而已,并没有使用QT的任何库)

Python调用C/C++库,我现在能做到的有两种方式

1.extern “C” 导出(互相传值比较麻烦,不建议使用这种方式):

将C/C++库做成和平常一样的DLL和或者.so,比如:

//.h文件
#include <Python.h>
//.cpp文件
//C/C++ my.so 或者my.dll
enter "C" void printHello()
{
  std::cout<<"Hello World"<<std::endl;
}
#Python
import ctypes 
from ctypes import *
loadso = ctypes.cdll.LoadLibrary 
mylib = loadso("./my.so")
mylib.printHello()
>>>Hello world

代码解释:

my.so 有一个C导出函数 printHello()

import ctypes  : 导入官方的一个库,顾名思义和C有关

loadso = ctypes.cdll.LoadLibrary  : loadso 表示加载库用的函数

mylib = loadso(“./my.so”)  //或者loadso(“my.dll”)  加载my.so库

mylib.printHello() : 调用库函数

上述代码能正常输出:Hello World,但是他们没有互相传值

Python和C++互相传值

//.h文件
#include <Python.h>
//.cpp文件
enter "C" int printHello(const char* str)
{
  std::cout<<str<<std::endl;
  return 1;  
}

那么Python的问题就来了

str = create_string_buffer(b"Hello World")
#mylib.printHello("Hello World") 这里死活就是显示:H,*(str+4)才是'e',*(str+8) 是'l' 依次类推
print (mylib.printHello(str))
>>>Hello World
>>>1
#由于对Python不是特别的熟悉 怎么也做不到显示C++返回的字符串, Python只能显示C++返回的字符串子能看到一个地址而已

2.Python扩展C/C++

不多说,直接上代码

//.h文件 本来这是C++连接Mysql 我只摘抄部分代#include <Python.h>
//.cpp文件
//传递多个参数 Python传过来的参数在args里面
PyObject* printfHello(PyObject* self,PyObject* args)
{
  int i=0
   const char* str;
  if (!PyArg_ParseTuple(args, "i|s", &i,&str))   //i 表示整形 s 表示字符串
    return PyLong_FromLong(0);
  print("%d,%s",i,str);
  return Py_BuildValue("s","OK");  //向Python返回OK字符串
}
//映射 知道MFC的一看就懂
static PyMethodDef MyMethods[] = {
{"printfHello", printfHello, METH_VARARGS,  //"printHello" 中可调用的函数 METH_VARARGS :带有参数   METH_NOARGS:无参数
"print"},   //说明
{"connect", connect, METH_VARARGS,
"connect mysql"},
{NULL, NULL, 0, NULL}
};
static PyObject* UtilError;
// 向Python中注册模块
static struct PyModuleDef spammodule = { 
PyModuleDef_HEAD_INIT,
"libMysqlUtil", //模块名字 import libMysqlUtil
"C++ Connect Mysql",
-1,
MyMethods
};//PyInit_libMysqlUtil 注意名字 一定要PyInit_ 加上你的模块名字 不然Python import 会提示没有定义 PyInit_你的模块名字 PyMODINIT_FUNC PyInit_libMysqlUtil(void) { PyObject* m = nullptr; m = PyModule_Create(&spammodule);
//m= Py_InitModule(....) Python 2.7 if(!m) { return m; } UtilError = PyErr_NewException("Util.error",NULL,NULL); Py_INCREF(UtilError); PyModule_AddObject(m,"error",UtilError); return m; }
#python
import libMysqlUtil
libMysqlUtil.printHello(1,"hello World")
>>>1,hello World
>>>OK

总结

到目前为止Python和C/C++互相通信,能适应大部分需求,结构体传值还没有研究,对于类,使用指针就行,C++里面是指针,在Python中会将指针转化成整形,Python将这个整形传给C++的时候使用PyArg_ParseTuple又将整形会变成类指针。

好了,以上就是本文的全部内容,希望本文的内容对大家学习python和C/C++能有所帮助。

Python 相关文章推荐
用Python写的图片蜘蛛人代码
Aug 27 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
python 实现在Excel末尾增加新行
May 02 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
详解pandas的外部数据导入与常用方法
May 01 Python
对tensorflow中的strides参数使用详解
Jan 04 Python
浅谈python的elementtree模块处理中文注意事项
Mar 06 Python
pycharm通过anaconda安装pyqt5的教程
Mar 24 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 Python
Tensorflow使用Anaconda、pycharm安装记录
Jul 29 Python
Python使用pycharm导入pymysql教程
Sep 16 Python
python实现自定义日志的具体方法
May 28 Python
浅析python中的分片与截断序列
Aug 09 #Python
总结python爬虫抓站的实用技巧
Aug 09 #Python
教你用Type Hint提高Python程序开发效率
Aug 08 #Python
Python如何实现文本转语音
Aug 08 #Python
Python脚本处理空格的方法
Aug 08 #Python
基于Python实现对PDF文件的OCR识别
Aug 05 #Python
利用Python实现命令行版的火车票查看器
Aug 05 #Python
You might like
php模拟asp中的XmlHttpRequest实现http请求的代码
2011/03/24 PHP
PHP curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
一个完整的PHP类包含的七种语法说明
2015/06/04 PHP
php常用数组函数实例小结
2016/12/29 PHP
最佳JS代码编写的14条技巧
2011/01/09 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
js时间查询插件使用详解
2017/04/07 Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
2017/06/08 Javascript
AngularJs中$cookies简单用法分析
2019/05/30 Javascript
JavaScript面向对象中接口实现方法详解
2019/07/24 Javascript
简单使用webpack打包文件的实现
2019/10/29 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
js实现验证码功能
2020/07/24 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
Python getopt模块处理命令行选项实例
2014/05/13 Python
Python实现各种排序算法的代码示例总结
2015/12/11 Python
Python-OpenCV基本操作方法详解
2018/04/02 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
python读取Excel表格文件的方法
2019/09/02 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
python+opencv实现车牌定位功能(实例代码)
2019/12/24 Python
python对一个数向上取整的实例方法
2020/06/18 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
Canvas 帧动画吃苹果小游戏
2020/08/05 HTML / CSS
全球销量第一生发产品:Viviscal
2017/12/21 全球购物
应届大学生自荐信
2013/12/05 职场文书
关于赌博的检讨书
2014/01/24 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
2015小学师德工作总结
2015/07/21 职场文书
Redis高级数据类型Hyperloglog、Bitmap的使用
2021/05/24 Redis
Vue-Element-Admin集成自己的接口实现登录跳转
2021/06/23 Vue.js