详解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中数字以及算数运算符的相关使用
Oct 12 Python
Python 数据结构之堆栈实例代码
Jan 22 Python
django rest framework之请求与响应(详解)
Nov 06 Python
Python使用pyodbc访问数据库操作方法详解
Jul 05 Python
用python脚本24小时刷浏览器的访问量方法
Dec 07 Python
Pandas之Fillna填充缺失数据的方法
Jun 25 Python
python使用pandas处理excel文件转为csv文件的方法示例
Jul 18 Python
django如何通过类视图使用装饰器
Jul 24 Python
python读文件的步骤
Oct 08 Python
python使用建议技巧分享(三)
Aug 18 Python
Python3.9.1中使用match方法详解
Feb 08 Python
python解决OpenCV在读取显示图片的时候闪退的问题
Feb 23 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
DISCUZ 分页代码
2007/01/02 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
2015/12/29 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
通过Unicode转义序列来加密,按你说的可以算是混淆吧
2007/05/06 Javascript
学习ExtJS Panel常用方法
2009/10/07 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
2012/07/21 Javascript
javascript:void(0)使用探讨
2013/08/27 Javascript
javascript简单事件处理和with用法介绍
2013/09/16 Javascript
js函数名与form表单元素同名冲突的问题
2014/03/07 Javascript
AngularJS入门教程之表格实例详解
2016/07/27 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
Python解析命令行读取参数--argparse模块使用方法
2018/01/23 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
python可视化text()函数使用详解
2020/02/11 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
2020/03/02 Python
Python 爬虫性能相关总结
2020/08/03 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
Python的logging模块基本用法
2020/12/24 Python
HTML5拖放API实现拖放排序的实例代码
2017/05/11 HTML / CSS
洗发露广告词
2014/03/14 职场文书
就业协议书样本
2014/08/20 职场文书
上班迟到检讨书300字
2014/10/18 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
先进党支部申报材料
2014/12/24 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
python urllib库的使用详解
2021/04/13 Python