详解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 相关文章推荐
windows下wxPython开发环境安装与配置方法
Jun 28 Python
Python获取Linux系统下的本机IP地址代码分享
Nov 07 Python
为Python的web框架编写前端模版的教程
Apr 30 Python
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
python线程、进程和协程详解
Jul 19 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
Django框架实现逆向解析url的方法
Jul 04 Python
如何使用Python实现斐波那契数列
Jul 02 Python
Django实现发送邮件功能
Jul 18 Python
Python with语句用法原理详解
Jul 03 Python
浅谈python处理json和redis hash的坑
Jul 16 Python
Python grpc超时机制代码示例
Sep 14 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的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
php stream_get_meta_data返回值
2013/09/29 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
2017/05/02 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
2018/01/15 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
JavaScript实现同时调用多个函数的方法
2015/11/09 Javascript
简单谈谈javascript中this的隐式绑定
2016/02/22 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
通过fastclick源码分析彻底解决tap“点透”
2017/12/24 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
Koa 中的错误处理解析
2019/04/09 Javascript
详解node登录接口之密码错误限制次数(含代码)
2019/10/25 Javascript
Python生成随机MAC地址
2015/03/10 Python
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
Python中pillow知识点学习
2018/04/30 Python
Python基于stuck实现scoket文件传输
2020/04/02 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
2020/04/30 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
升职自荐信范文
2013/10/05 职场文书
五一家具促销方案
2014/01/10 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
出生证明格式
2015/06/15 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
医学会议开幕词
2016/03/03 职场文书
2016年教师党员公开承诺书
2016/03/24 职场文书