详解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程序
Apr 04 Python
Python环境下安装使用异步任务队列包Celery的基础教程
May 07 Python
详解python如何调用C/C++底层库与互相传值
Aug 10 Python
python基础教程项目四之新闻聚合
Apr 02 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
Jan 17 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
Mar 01 Python
python中栈的原理及实现方法示例
Nov 27 Python
python实现输入的数据在地图上生成热力图效果
Dec 06 Python
Tensorflow不支持AVX2指令集的解决方法
Feb 03 Python
Python Sqlalchemy如何实现select for update
Oct 12 Python
python动态规划算法实例详解
Nov 22 Python
通用的Django注册功能模块实现方法
Feb 05 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
smarty模板中拼接字符串的方法
2014/02/14 PHP
PHP连接和操作MySQL数据库基础教程
2014/09/29 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
jQuery实现长文字部分显示代码
2013/05/13 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
详解Vue.directive 自定义指令
2019/03/27 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
使用Scrapy爬取动态数据
2018/10/21 Python
python监测当前联网状态并连接的实例
2018/12/18 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
搭建python django虚拟环境完整步骤详解
2019/07/08 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
python super用法及原理详解
2020/01/20 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
Python模块常用四种安装方式
2020/10/20 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
实习生体会的自我评价范文
2013/11/28 职场文书
师范生个人推荐信
2013/11/29 职场文书
高校辅导员推荐信范文
2013/12/25 职场文书
给领导的致歉信范文
2014/01/13 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
钢琴师观后感
2015/06/12 职场文书
教务处教学工作总结
2015/08/10 职场文书