详解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使用mysqldb连接数据库操作方法示例详解
Dec 03 Python
Python自动化构建工具scons使用入门笔记
Mar 10 Python
用Python将动态GIF图片倒放播放的方法
Nov 02 Python
Django 添加静态文件的两种实现方法(必看篇)
Jul 14 Python
python 将md5转为16字节的方法
May 29 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
Python Flask前后端Ajax交互的方法示例
Jul 31 Python
Windows下Python3.6安装第三方模块的方法
Nov 22 Python
对python中Librosa的mfcc步骤详解
Jan 09 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
Apr 16 Python
对Python _取log的几种方式小结
Jul 25 Python
kafka-python 获取topic lag值方式
Dec 23 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
星际争霸兵种名称对照表
2020/03/04 星际争霸
基于wordpress主题制作的具体实现步骤
2013/05/10 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
jQuery实现的网页换肤效果示例
2016/09/20 Javascript
localStorage的黑科技-js和css缓存机制
2017/02/06 Javascript
详解angularjs4部署文件过大解决过程
2018/12/05 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
基于JQuery和DWR实现异步数据传递
2020/10/16 jQuery
python Django模板的使用方法(图文)
2013/11/04 Python
python实现简单温度转换的方法
2015/03/13 Python
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
python字符串的常用操作方法小结
2016/05/21 Python
使用 Python 实现微信群友统计器的思路详解
2018/09/26 Python
Python Django基础二之URL路由系统
2019/07/18 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
pycharm专业版远程登录服务器的详细教程
2020/09/15 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
SmartBuyGlasses荷兰:购买太阳镜和眼镜
2020/03/16 全球购物
介绍java中初始化块的使用
2012/09/11 面试题
一组SQL面试题
2016/02/15 面试题
渡河少年教学反思
2014/02/12 职场文书
党员理论学习心得体会
2016/01/21 职场文书
详解Nginx启动失败的几种错误处理
2021/04/01 Servers
Python3接口性能测试实例代码
2021/06/20 Python
HDFS免重启挂载新磁盘
2022/04/06 Servers