详解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获取Windows或Linux主机名称通用函数分享
Nov 22 Python
Python中死锁的形成示例及死锁情况的防止
Jun 14 Python
全面了解python中的类,对象,方法,属性
Sep 11 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
python smtplib模块自动收发邮件功能(二)
May 22 Python
python的中异常处理机制
Aug 30 Python
在python中以相同顺序shuffle两个list的方法
Dec 13 Python
python http基本验证方法
Dec 26 Python
Python Numpy库安装与基本操作示例
Jan 08 Python
python安装pywin32clipboard的操作方法
Jan 24 Python
python实现栅栏加解密 支持密钥加密
Mar 20 Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 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
MySQL授权问题总结
2007/05/06 PHP
PHP 一个页面执行时间类代码
2010/03/05 PHP
PHP学习笔记之二
2011/01/17 PHP
php.ini save_handler 修改不生效的解决办法
2014/07/22 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
微信小程序 textarea 详解及简单使用方法
2016/12/05 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
微信小程序左滑删除实现代码实例
2019/09/16 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
2020/07/31 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
Python Socket实现简单TCP Server/client功能示例
2017/08/05 Python
python获取地震信息 微信实时推送
2019/06/18 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
Python自动化之UnitTest框架实战记录
2020/09/08 Python
python中time tzset()函数实例用法
2021/02/18 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
在html页面中取得session中的值的方法
2020/08/11 HTML / CSS
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
另类冲刺标语
2014/06/24 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
公司更名通知函
2015/04/24 职场文书
李强为自己工作观后感
2015/06/11 职场文书
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android
Win11快速关闭所有广告推荐
2022/04/19 数码科技
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技