详解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实现股市信息下载的方法
Jun 15 Python
Python随手笔记之标准类型内建函数
Dec 02 Python
Python实现信用卡系统(支持购物、转账、存取钱)
Jun 24 Python
Python处理JSON数据并生成条形图
Aug 05 Python
基于python元祖与字典与集合的粗浅认识
Aug 23 Python
Python+OpenCV人脸检测原理及示例详解
Oct 19 Python
Python实现一个服务器监听多个客户端请求
Apr 12 Python
在windows下Python打印彩色字体的方法
May 15 Python
python的命名规则知识点总结
Oct 04 Python
Python简单实现区域生长方式
Jan 16 Python
python属于解释语言吗
Jun 11 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
Feb 26 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
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
2009/10/31 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
解决jquery的.animate()函数在IE6下的问题
2010/12/03 Javascript
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
Javascript中判断变量是数组还是对象(array还是object)
2013/08/14 Javascript
js综合应用实例简单的表格统计
2013/09/03 Javascript
jQuery aminate方法定位到页面具体位置
2013/12/26 Javascript
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
jQuery插件ajaxFileUpload使用实例解析
2016/10/19 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
2017/02/07 Javascript
AngularJS中下拉框的高级用法示例
2017/10/11 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
python关闭windows进程的方法
2015/04/18 Python
python的pip安装以及使用教程
2018/09/18 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
python实现AES加密和解密
2019/03/27 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
Flask模板引擎Jinja2使用实例
2020/04/23 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
几个Linux面试题笔试题
2012/12/01 面试题
潘婷洗发水广告词
2014/03/14 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
优秀教师感人事迹材料
2014/05/04 职场文书
数学教研活动总结
2014/07/02 职场文书
工作证明格式及范本
2014/09/12 职场文书
天坛导游词
2015/02/02 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
SONY600GR,国产收音机厂商永远的痛
2022/04/05 无线电
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server