详解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
Python内置的字符串处理函数详细整理(覆盖日常所用)
Aug 19 Python
python中List的sort方法指南
Sep 01 Python
Python脚本暴力破解栅栏密码
Oct 19 Python
Python切换pip安装源的方法详解
Nov 18 Python
Python:Scrapy框架中Item Pipeline组件使用详解
Dec 27 Python
python监控文件并且发送告警邮件
Jun 21 Python
对python周期性定时器的示例详解
Feb 19 Python
使用python采集Excel表中某一格数据
May 14 Python
opencv 图像滤波(均值,方框,高斯,中值)
Jul 08 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 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学习之PHP运算符
2006/10/09 PHP
理解php原理的opcodes(操作码)
2010/10/26 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
php获取QQ头像并显示的方法
2014/12/23 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
Jquery Validation插件防止重复提交表单的解决方法
2010/03/05 Javascript
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
jQuery滚动新闻实现代码
2016/06/26 Javascript
详解jQuery选择器
2016/12/21 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
js canvas实现画图、滤镜效果
2018/11/27 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
vue通过数据过滤实现表格合并
2020/11/30 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
支教自我鉴定
2014/01/18 职场文书
五星级酒店餐饮部总监的标准岗位职责
2014/02/17 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
依法行政工作汇报材料
2014/10/28 职场文书
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis