详解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命令行参数解析模块getopt使用实例
Apr 13 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
Jun 26 Python
Python使用wxPython实现计算器
Jan 30 Python
深入理解Python爬虫代理池服务
Feb 28 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
python 求10个数的平均数实例
Dec 16 Python
Pytorch 实现冻结指定卷积层的参数
Jan 06 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
Python使用OpenPyXL处理Excel表格
Jul 02 Python
5款实用的python 工具推荐
Oct 13 Python
python 视频下载神器(you-get)的具体使用
Jan 06 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 str_pad() 将字符串填充成指定长度的字符串
2010/02/23 PHP
javascript,php获取函数参数对象的代码
2011/02/03 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
redis查看连接数及php模拟并发创建redis连接的方法
2016/12/15 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
自制微信公众号一键排版工具
2016/09/22 Javascript
微信小程序 canvas API详解及实例代码
2016/10/08 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
python解析xml模块封装代码
2014/02/07 Python
python根据距离和时长计算配速示例
2014/02/16 Python
python使用cookielib库示例分享
2014/03/03 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
Django集成CAS单点登录的方法示例
2019/06/10 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
python字符串替换re.sub()实例解析
2020/02/09 Python
python里的单引号和双引号的有什么作用
2020/06/17 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
YSL Beauty加拿大官方商城:圣罗兰美妆加拿大
2017/05/15 全球购物
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
《桃花心木》教学反思
2014/02/17 职场文书
外贸专业求职信
2014/03/09 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python