详解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 30 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
Python中查看文件名和文件路径
Mar 31 Python
python中hashlib模块用法示例
Oct 30 Python
python操作redis方法总结
Jun 06 Python
python实现批量视频分帧、保存视频帧
May 31 Python
Python学习笔记之字符串和字符串方法实例详解
Aug 22 Python
python实现井字棋小游戏
Mar 04 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
Mar 30 Python
Python+logging输出到屏幕将log日志写入文件
Nov 11 Python
python函数超时自动退出的实操方法
Dec 28 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 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数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
PHP无限分类(树形类)的深入分析
2013/06/02 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
php学习笔记之字符串常见操作总结
2019/07/16 PHP
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
js获取url中指定参数值的示例代码
2013/12/14 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
分享五个有用的jquery小技巧
2015/10/08 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
使用javascript插入样式
2016/03/14 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
2016/04/05 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
详解自定义ajax支持跨域组件封装
2018/02/08 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
Element Backtop回到顶部的具体使用
2020/07/27 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
python基础教程之循环介绍
2014/08/29 Python
python编写简单爬虫资料汇总
2016/03/22 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
python打包生成so文件的实现
2020/10/30 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
Clarins娇韵诗英国官网:来自法国的天然护肤品牌
2017/04/18 全球购物
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
五年级音乐教学反思
2014/02/06 职场文书
新年抽奖获奖感言
2014/03/02 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
元旦促销方案
2014/03/15 职场文书
2016中学教师读书心得体会
2016/01/13 职场文书
《伯牙绝弦》教学反思
2016/02/16 职场文书
小学生节约用水倡议书
2019/08/12 职场文书