前言

开发环境:

Centos 7 + Python 3.5.1 + Qt Creator(只是使用Qt Creator编译而已,并没有使用QT的任何库)

Python调用C/C++库,我现在能做到的有两种方式

1.extern “C” 导出(互相传值比较麻烦,不建议使用这种方式):

将C/C++库做成和平常一样的DLL和或者.so,比如:

//.h文件

#include

//.cpp文件

//C/C++ my.so 或者my.dll

enter "C" void printHello()

{

std::cout<<"Hello World"<

}

#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

//.cpp文件

enter "C" int printHello(const char* str)

{

std::cout<

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

//.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++能有所帮助。

c与python 数据传递-详解python如何调用C/C++底层库与互相传值相关推荐

  1. python提取hbase数据_详解python操作hbase数据的方法介绍

    配置 thrift python使用的包 thrift 个人使用的python 编译器是pycharm community edition. 在工程中设置中,找到project interpreter ...

  2. python获取mp3音频数据_详解python进行mp3格式判断 python怎么读取mp3文件

    python中哪个库有em算法 EM算法初稿2016-4-28 初始化三个一维的高斯分布 from numpy import * import numpy as np import matplotli ...

  3. python 标准输出_详解Python的标准输入输出

    本篇文章给大家分享的是详解Python的标准输入输出,内容挺不错的,希望可以帮助到有需要的朋友 一.标准输入输出 1.打印到屏幕 产生输出的最简单方法是使用print语句,可以通过用逗号分隔零个或多个 ...

  4. python import io_详解Python IO编程

    文件读写 读文件 try: # windows下utf8 f = open('./README.md', 'r', encoding='utf8', errors='ignore') print(f. ...

  5. python流程控制-详解Python流程控制语句

    流程控制 流程:代码执行的过程 控制:对代码执行过程的把控 三大结构 顺序结构:代码默认从上到下,依次执行 分支结构:单项分支,双向分支,多项分支,巢状分支 循环结构:while循环和for循环 单项 ...

  6. python操作符op_详解python中的 is 操作符

    大家可以与Java中的 == 操作符相互印证一下,加深一下对引用和对象的理解.原问题: Python为什么直接运行和在命令行运行同样语句但结果却不同,他们的缓存机制不同吗? 其实,高票答案已经说得很详 ...

  7. Python数据可视化详解(5/5)--------面积图、圆环图和Python里的极坐标

    面积图 import numpy as np import matplotlib.pyplot as pltx = [2,3,4,5,6,7] y = [4,5,1,2,5,2]plt.fill_be ...

  8. python循环语句-详解Python中的循环语句的用法

    一.简介 Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性.须重要理解,if.while.for以及与它们相搭配的 else. elif.break.continue和pass语句 ...

  9. python数组排序sort_详解python中sort排序使用

    1.前言 昨天一学妹问我一个关于python的问题,当时在外忙碌,没时间细看.今天看一下,咋一看我还真的不知道这个问题,bookinfo.sort(reverse=True ,key=lambda x ...

最新文章

  1. 计算机英语考试试题一附答案,计算机英语考试试题一附答案
  2. python qtablewedgit_PyQt5-高级控件使用(QTableWidget)
  3. linux 和 windows 上printf 的不同
  4. 二叉树的中序遍历_Go 刷 leetcode从前序与中序遍历序列构造二叉树
  5. 【爱心代码大全】——情人节表白代码送给她属于我们程序员的浪漫
  6. 地面控制点的定义与作用_什么是地面塌陷
  7. 使用Iterator 或for-each注意:java.util.ConcurrentModificationException
  8. CentOS下调整VolGroup-lv_root分区大小
  9. Web测试中新增修改功能测试
  10. SAP License:由师姐的包包所想到如何能够掌握客户的需求
  11. 深入理解SYN***.+防范思想及ROS设置
  12. 关于没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题的解决方案
  13. 安徽建立“库长制” 千余名库长保粮食安全
  14. 生活中笔记本内存的主要作用
  15. SpringBoot+vue实现前后端分离的校园志愿者管理系统
  16. windows10获取超级管理员权限
  17. html艺术字在线制作,超全的免费图标字体(在线图标字体制作)
  18. w10计算机恢复出厂设置,如何给win10系统的电脑强制恢复出厂设置
  19. springboot 使用mybatis-plus 配置乐观锁。
  20. AI优秀开源项目总结

热门文章

  1. Marketing Cloud里Odata请求响应结构的解析
  2. What is the difference between BTD and Q35
  3. 点击Result list里product ID出现白屏的又一原因及分析
  4. Kubernetes kubectl proxy命令的妙用
  5. 18岁初中毕业学Java_刚满十八 初中毕业 java自学完了 没学历 该怎么办?
  6. 多点积分又改规则了_2020年落户广州积分入户名额有多少个?如何加分?
  7. C语言abc输出最小值改错题,C语言程序设计
  8. java array 元素的位置_java中的两种排序工具Arrays和Collections的使用
  9. 65535 java_Databinding引起的 java方法大于 65535 的问题
  10. 自动化html定位,Selenium自动化定位方法