当前位置: 首页 > news >正文

500网站建设/论坛发帖

500网站建设,论坛发帖,东莞市网络策划推广哪家好,独立做网站需要学什么条件Python作为一门脚本解释语言,本身又很好的结合C,所以使用Python开发,在性能要求的地方调用C/C底层库,这简直是神器。本文详细介绍了Python调用C/C底层库,互相传值问题,下面一起来看看。前言开发环境&#x…

Python作为一门脚本解释语言,本身又很好的结合C++,所以使用Python开发,在性能要求的地方调用C/C++底层库,这简直是神器。本文详细介绍了Python调用C/C++底层库,互相传值问题,下面一起来看看。

前言

开发环境:

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<

}

#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++底层库与互相传值相关文章请关注PHP中文网!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

http://www.jmfq.cn/news/4974175.html

相关文章:

  • wordpress 背景特效/搜索引擎优化的定义是什么
  • 网站设计公司业务怎么做/网站代发外链
  • 搭建什么网站好玩/推广方案经典范文
  • b2b商城网站开发/爱站网排名
  • 常见的cms网站/seo海外推广
  • seo推广优化外包公司/seo软件服务
  • 新手怎么做网站打理/外贸出口平台网站
  • 网站建设一个购买链接/nba球队排名
  • Wordpress如何加联盟广告/广州宣布5条优化措施
  • 敦煌手机网站设计/如何开展网络营销
  • 设计部联盟网站/合肥做网站的公司有哪些
  • iH5做网站/各地疫情最新消息
  • 拼多多网站在那里做/关键词查找的方法有以下几种
  • 可以做问卷的网站有哪些/百度指数分析报告
  • 搜索引擎营销的四种方式/seo公司彼亿营销
  • 南京网站开发南京乐识正规/今天的新闻联播
  • 文件什么上传到wordpress/北京seo助理
  • 企业的网站建设文章/网站的优化seo
  • 汕头网站推广seo/lol今日赛事直播
  • 公司网站域名怎么加www./免费推广的网站有哪些
  • wordpress模板仿新版虎嗅huxiu-new主题/百度seo优化教程免费
  • 网站制作团队分工/如何做网络营销
  • 我找客户做网站怎么说/企业营销策略分析论文
  • 易捷网/西安seo服务公司
  • 高端服装网站/推广营销软件
  • 漳州微网站建设价格/网站查询备案信息
  • 在线安装wordpress/优化网站排名需要多少钱
  • 建设培训中心网站/百度快照推广是什么意思
  • 权威发布是指什么/西安seo网站关键词优化
  • 机房建设网站/优化大师手机版