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

怎样让Python脚本与C++程序互相调用

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

我来回答

1个回答

热心网友 时间:2023-11-05 16:17

二、Python调用C/C++\x0d\x0a\x0d\x0a\x0d\x0a1、Python调用C动态链接库\x0d\x0a\x0d\x0a Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可。\x0d\x0a(1)C语言文件:pycall.c\x0d\x0a\x0d\x0a[html] view plain copy \x0d\x0a/***gcc -o libpycall.so -shared -fPIC pycall.c*/ \x0d\x0a#include \x0d\x0a#include \x0d\x0aint foo(int a, int b) \x0d\x0a{ \x0d\x0a printf("you input %d and %d\n", a, b); \x0d\x0a return a+b; \x0d\x0a} \x0d\x0a(2)gcc编译生成动态库libpycall.so:gcc -o libpycall.so -shared -fPIC pycall.c。使用g++编译生成C动态库的代码中的函数或者方法时,需要使用extern "C"来进行编译。\x0d\x0a(3)Python调用动态库的文件:pycall.py\x0d\x0a\x0d\x0a[html] view plain copy \x0d\x0aimport ctypes \x0d\x0all = ctypes.cdll.LoadLibrary \x0d\x0alib = ll("./libpycall.so") \x0d\x0alib.foo(1, 3) \x0d\x0aprint '***finish***' \x0d\x0a(4)运行结果:\x0d\x0a\x0d\x0a\x0d\x0a2、Python调用C++(类)动态链接库 \x0d\x0a\x0d\x0a 需要extern "C"来辅助,也就是说还是只能调用C函数,不能直接调用方法,但是能解析C++方法。不是用extern "C",构建后的动态链接库没有这些函数的符号表。\x0d\x0a(1)C++类文件:pycallclass.cpp\x0d\x0a\x0d\x0a[html] view plain copy \x0d\x0a#include \x0d\x0ausing namespace std; \x0d\x0a \x0d\x0aclass TestLib \x0d\x0a{ \x0d\x0a public: \x0d\x0a void display(); \x0d\x0a void display(int a); \x0d\x0a}; \x0d\x0avoid TestLib::display() { \x0d\x0a cout<<"First display"<\x0d\x0a#include \x0d\x0a#include \x0d\x0a \x0d\x0aint fac(int n) \x0d\x0a{ \x0d\x0a if (n < 2) return(1); /* 0! == 1! == 1 */ \x0d\x0a return (n)*fac(n-1); /* n! == n*(n-1)! */ \x0d\x0a} \x0d\x0a \x0d\x0achar *reverse(char *s) \x0d\x0a{ \x0d\x0a register char t, /* tmp */ \x0d\x0a *p = s, /* fwd */ \x0d\x0a *q = (s + (strlen(s) - 1)); /* bwd */ \x0d\x0a \x0d\x0a while (p < q) /* if p < q */ \x0d\x0a { \x0d\x0a t = *p; /* swap & move ptrs */ \x0d\x0a *p++ = *q; \x0d\x0a *q-- = t; \x0d\x0a } \x0d\x0a return(s); \x0d\x0a} \x0d\x0a \x0d\x0aint main() \x0d\x0a{ \x0d\x0a char s[BUFSIZ]; \x0d\x0a printf("4! == %d\n", fac(4)); \x0d\x0a printf("8! == %d\n", fac(8)); \x0d\x0a printf("12! == %d\n", fac(12)); \x0d\x0a strcpy(s, "abcdef"); \x0d\x0a printf("reversing 'abcdef', we get '%s'\n", \ \x0d\x0a reverse(s)); \x0d\x0a strcpy(s, "madam"); \x0d\x0a printf("reversing 'madam', we get '%s'\n", \ \x0d\x0a reverse(s)); \x0d\x0a return 0; \x0d\x0a} \x0d\x0a 上述代码中有两个函数,一个是递归求阶乘的函数fac();另一个reverse()函数实现了一个简单的字符串反转算法,其主要目的是修改传入的字符串,使其内容完全反转,但不需要申请内存后反着复制的方法。\x0d\x0a(2)用样板来包装代码\x0d\x0a 接口的代码被称为“样板”代码,它是应用程序代码与Python解释器之间进行交互所必不可少的一部分。样板主要分为4步:a、包含Python的头文件;b、为每个模块的每一个函数增加一个型如PyObject* Mole_func()的包装函数;c、为每个模块增加一个型如PyMethodDef MoleMethods[]的数组;d、增加模块初始化函数void initMole()。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
有什么烹饪技巧可以让明虾金鱼酥更好吃? 有哪些制作明虾金鱼酥的教程? 明虾金鱼酥如何烹饪好吃又解馋? 明虾金鱼酥怎样做好吃又解馋? 五年级下册数学同步口算45,46页答案 五年级下册口算题卡45页和46页答案 怎么设置excel数据条 大专汽修学什么 难忘的一个人300字 外交辞令往往委婉含蓄,隐藏着“潜台词”,听话者应仔细揣摩,才能灵活... 在Linux和windows上运行虚拟机哪个会更高效 虚拟机下CentOS 7安装websphere 启动服务报错 vagrant 怎么安装 lnmp 环境 如何安装Ruby和RubyGems mac子弹头哪些是滋润的 虚拟机怎么用命令行安装mysql mac 怎么登录到 linux 服务器并传输文件 Mac可以运行Linux吗 打印机使用过程中会出现哪些常见问题? 笔记本内存加装一个8g的内存条要多少钱 一般给笔记本电脑加内存条要多少钱 去修电脑的地方加一个内存条大约多少钱 电脑装个内存条多少钱 笔记本想加个内存条 4g或者8g 大概需要多少钱啊? 笔记本加内存条价格大概多少 台式电脑加一个内存得多少钱 笔记本电脑加内存条要多少钱? 我自己买了个内存条如果去电脑店装,要多钱,笔记本电脑的? 笔记本加内存条大概多少钱 梅艳芳是因为什么原因去世的? 阿里云服务器怎么运行node Python图像库失败消息问题,怎么解决 fedora 11上网的问题 如何在阿里云服务器上搭建nodejs 不同国家有关的儿童的民俗 小学五年级暑假作业民族风情我知道63页答案 我想知道中国各民族的风情习俗? 民族风俗有那些 留给少数民族儿童的一封信作文300字 民族风情 内蒙古的民族风情 你知到各民族风情吗 如何激发幼儿对中国传统文化的兴趣,萌发民族自豪感 民间儿童游戏对传统民族文化有何传承价值 求有关民族风情的广播稿 不同的民族民俗活动 蒙古族的民族风情!!!快快快!!急急急!! 请问一般打印机坏了是有什么问题,应该要怎么修? 梦见跟自己不喜欢的人结婚了,醒来心情不好,求解。