问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何让python调用C和C++代码

发布网友 发布时间:2022-04-21 07:04

我来回答

3个回答

懂视网 时间:2022-04-07 16:31

大家都知道Python的优点是开发效率高,使用方便,C++则是运行效率高,这两者可以相辅相成,不管是在Python项目中嵌入C++代码,或是在C++项目中用Python实现外围功能,都可能遇到Python调用C++模块的需求.

下面列举出集中c++代码导出成Python接口的方法,一起来学习学习吧。

原生态导出(推荐学习:Python视频教程)

Python解释器就是用C实现,因此只要我们的C++的数据结构能让Python认识,理论上就是可以被直接调用的。我们实现test1.cpp如下

#include <Python.h>
int Add(int x, int y)
{
return x + y;
}
int Del(int x, int y)
{
return x - y;
}
PyObject* WrappAdd(PyObject* self, PyObject* args)
{
int x, y;
if (!PyArg_ParseTuple(args, "ii", &x, &y))
{
return NULL;
}
return Py_BuildValue("i", Add(x, y));
}
PyObject* WrappDel(PyObject* self, PyObject* args)
{
int x, y;
if (!PyArg_ParseTuple(args, "ii", &x, &y))
{
return NULL;
}
return Py_BuildValue("i", Del(x, y));
}
static PyMethodDef test_methods[] = {
{"Add", WrappAdd, METH_VARARGS, "something"},
{"Del", WrappDel, METH_VARARGS, "something"},
{NULL, NULL}
};
extern "C"
void inittest1()
{
Py_InitModule("test1", test_methods); 
}

编译命令如下

g++ -fPIC -shared test1.cpp -I/usr/include/python2.7 -o test1.so

-fPIC:生成位置无关目标代码,适用于动态连接;
-L path:表示在path目录中搜索库文件,如-L.表示在当前目录;
-I path:表示在path目录中搜索头文件;
-o file:制定输出文件为file;
-shared:生成一个共享库文件;

运行Python解释器,测试如下

>>> import test1
>>> test1.Add(1,2)
3

这里要注意一下几点

如果生成的动态库名字为test1,则源文件里必须有inittest1这个函数,且Py_InitModule的第一个参数必须是“test1”,否则Python导入模块会失败

如果是cpp源文件,inittest1函数必须用extern "C"修饰,如果是c源文件,则不需要。原因是Python解释器在导入库时会寻找initxxx这样的函数,而C和C++对函数符号的编码方式不同,C++在对函数符号进行编码时会考虑函数长度和参数类型,具体可以通过nm test1.so查看函数符号,c++filt工具可通过符号反解出函数原型

更多Python相关技术文章,请访问Python教程栏目进行学习!

热心网友 时间:2022-04-07 13:39

二、Python调用C/C++1、Python调用C动态链接库Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可。(1)C语言文件:pycall.c[html]viewplaincopy/***gcc-olibpycall.so-shared-fPICpycall.c*/#include#includeintfoo(inta,intb){printf("youinput%dand%d\n",a,b);returna+b;}(2)gcc编译生成动态库libpycall.so:gcc-olibpycall.so-shared-fPICpycall.c。使用g++编译生成C动态库的代码中的函数或者方法时,需要使用extern"C"来进行编译。(3)Python调用动态库的文件:pycall.py[html]viewplaincopyimportctypesll=ctypes.cdll.LoadLibrarylib=ll("./libpycall.so")lib.foo(1,3)print'***finish***'(4)运行结果:2、Python调用C++(类)动态链接库需要extern"C"来辅助,也就是说还是只能调用C函数,不能直接调用方法,但是能解析C++方法。不是用extern"C",构建后的动态链接库没有这些函数的符号表。(1)C++类文件:pycallclass.cpp[html]viewplaincopy#includeusingnamespacestd;classTestLib{public:voiddisplay();voiddisplay(inta);};voidTestLib::display(){cout#include#includeintfac(intn){if(n<2)return(1);/*0!==1!==1*/return(n)*fac(n-1);/*n!==n*(n-1)!*/}char*reverse(char*s){registerchart,/*tmp*/*p=s,/*fwd*/*q=(s+(strlen(s)-1));/*bwd*/while(p

热心网友 时间:2022-04-07 14:57

出门左转搜索引擎,有个东西叫 ctypes
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 showMsg(n,name),输出n行的字符串&quot;Happy Birthday***&quot;? 在java中ShowMsg()怎么用 安全教育教师授课一次,全班都完成才能继续授课吗? 我部队为安全献一计 士兵的部队安全教育个人总结怎么写? 部队安全教育心得体会怎么写 部队安全稳定教育心得体会怎么写? 军队行车安全教育的目的意义 部队安全教育的意义 浅谈如何做好部队安全工作 每周一题52课部队安全教育 部队国家安全教育怎么开展 部队安全训练常识教育的课件哪里有? 武警部队百日安全无事故心得体会怎么写? 急求 急求 部队安全教育个人总结(士兵的) opporeno7Pro和vivoX70比较下哪个好啊? 部队送学教育教案带途中安全注意事项的 opporeno7Pro和vivox70推荐哪个? 国家安全教育日部队应该从哪些方面宣讲 Fatal error: Call to undefined function showmsg() in E:&#92;www&#92;post.php on line 4 java中Eclipse关于调用方法的讲解,没看懂 404 Not Found 急求!!C语言课后习题答案!2 404 Not Found c# Regex 正则表达 c++调用python 飞利浦要连接USB,却出现&quot;DLL函数调用失败:ISRT._SdShowMsg&quot;的问题 jspp如何使用阅后即焚? android里如何调用Js里的函数 使用pyqt4写GUI小程序时一个clicked信号调用三次槽函数 如何使用 AlertDialog 的返回值 求Delphi 7 调用函数和过程的实例 C++如何调用.dll文件 C#中form2.parametered+=param;是什么意思? [急]求一能显示/打印自身的函数或宏,请高手指教!!! js中的setInterval有哪些属性 怎样清除wps缓存 怎么删除空白的wps页 wps表格如何把空业去掉