详解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 01 Python
python使用htmllib分析网页内容的方法
May 08 Python
详解详解Python中writelines()方法的使用
May 25 Python
详解Python中的元组与逻辑运算符
Oct 13 Python
Python文件夹与文件的相关操作(推荐)
Jul 25 Python
Python中字符串的常见操作技巧总结
Jul 28 Python
pandas 将索引值相加的方法
Nov 15 Python
python数据挖掘需要学的内容
Jun 23 Python
python实现复制大量文件功能
Aug 31 Python
使用Python函数进行模块化的实现
Nov 15 Python
django实现web接口 python3模拟Post请求方式
Nov 19 Python
聊聊python在linux下与windows下导入模块的区别说明
Mar 03 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类常量的使用详解
2013/06/08 PHP
PHP命名空间(Namespace)简明教程
2014/06/11 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
2017/09/28 PHP
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
jquery Mobile入门—多页面切换示例学习
2013/01/08 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
微信小程序 基础知识css样式media标签
2017/02/15 Javascript
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
2017/09/05 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
简述JS控制台的使用
2018/07/15 Javascript
layui table设置前台过滤转义等方法
2018/08/17 Javascript
vue-cli脚手架打包静态资源请求出错的原因与解决
2019/06/06 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
详解python的几种标准输出重定向方式
2016/08/15 Python
python 调用win32pai 操作cmd的方法
2017/05/28 Python
Django中login_required装饰器的深入介绍
2017/11/24 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
python实现DEM数据的阴影生成的方法
2019/07/23 Python
Python 硬币兑换问题
2019/07/29 Python
python、Matlab求定积分的实现
2019/11/20 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
用 python 进行微信好友信息分析
2020/11/28 Python
Python用requests库爬取返回为空的解决办法
2021/02/21 Python
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
RealTek面试题
2016/06/28 面试题
安全标准化实施方案
2014/02/20 职场文书
团日活动总结怎么写
2014/06/25 职场文书
2014年审计工作总结
2014/11/17 职场文书
研讨会致辞
2015/07/31 职场文书
素质教育培训心得体会
2016/01/19 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript
浅谈Python中对象是如何被调用的
2022/04/06 Python