详解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 max内置函数详细介绍
Nov 17 Python
Python序列操作之进阶篇
Dec 08 Python
python 读取txt,json和hdf5文件的实例
Jun 05 Python
Python3利用print输出带颜色的彩色字体示例代码
Apr 08 Python
Django Rest framework频率原理与限制
Jul 26 Python
Python流程控制 if else实现解析
Sep 02 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
利用Python小工具实现3秒钟将视频转换为音频
Oct 29 Python
django xadmin action兼容自定义model权限教程
Mar 30 Python
Django CBV模型源码运行流程详解
Aug 17 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 24 Python
Python 正则模块详情
Nov 02 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连接数据库代码应用分析
2011/05/29 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
javascript对JSON数据排序的3个例子
2014/04/12 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
2014/07/31 Javascript
浅谈js中的闭包
2015/03/16 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
2016/01/28 Javascript
Javascript之BOM(window对象)详解
2016/05/25 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
使用Vuex实现一个笔记应用的方法
2018/03/13 Javascript
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
[44:58]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第二场
2018/04/06 DOTA
详解Python中for循环是如何工作的
2017/06/30 Python
python实现人脸识别代码
2017/11/08 Python
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
python最小生成树kruskal与prim算法详解
2019/01/17 Python
python sorted函数的小练习及解答
2019/09/18 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
互动出版网:专业书籍
2017/03/21 全球购物
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
电子商务专业实习生自我鉴定
2013/09/24 职场文书
集团公司党的群众路线教育实践活动工作总结
2014/03/03 职场文书
项目经理任命书范本
2014/06/05 职场文书
2014年教师节演讲稿
2014/09/03 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
城管个人总结
2015/02/28 职场文书
新闻稿件写作范文
2015/07/18 职场文书