1楼:好程序员
二、python调用c/c++
1、python调用c动态链接库
python调用c库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可。
(1)c语言文件:pycall.c
[html] view plain copy
/***gcc -o libpycall.so -shared -fpic pycall.c*/
#include
#include
int foo(int a, int b)
(2)gcc编译生成动态库libpycall.so:gcc -o libpycall.
so -shared -fpic pycall.c。使用g++编译生成c动态库的**中的函数或者方法时,需要使用extern "c"来进行编译。
(3)python调用动态库的文件:pycall.py
[html] view plain copy
import ctypes
ll = ctypes.cdll.loadlibrary
lib = ll("./libpycall.so")
lib.foo(1, 3)
print '***finish***'
(4)运行结果:
2、python调用c++(类)动态链接库
需要extern "c"来辅助,也就是说还是只能调用c函数,不能直接调用方法,但是能解析c++方法。不是用extern "c",构建后的动态链接库没有这些函数的符号表。
(1)c++类文件:pycallclass.cpp
[html] view plain copy
#include
using namespace std;
class testlib
; void testlib::display()
int main()
char *reverse(char *s)
return(s);
} int main()
上述**中有两个函数,一个是递归求阶乘的函数fac();另一个reverse()函数实现了一个简单的字符串反转算法,其主要目的是修改传入的字符串,使其内容完全反转,但不需要申请内存后反着复制的方法。
(2)用样板来包装**
接口的**被称为“样板”**,它是应用程序**与python解释器之间进行交互所必不可少的一部分。样板主要分为4步:a、包含python的头文件;b、为每个模块的每一个函数增加一个型如pyobject* module_func()的包装函数;c、为每个模块增加一个型如pymethoddef modulemethods的数组;d、增加模块初始化函数void initmodule()。
请教编程高手一个python与c++相互调用的问题
2楼:匿名用户
python 我不懂,了解过,似乎是解释型语言,不过有py2exe这东西,
如果你知道python的结构体在内存中的组织形式,那你把数据的内存组织形式告诉我,我可以给你封装一个库,这个库提供c++接口接收你的结构体参数
如果你自己懂某一操作平台下的c++底层实现(懂汇编就ok),这问题分分钟搞定
如果你懂python的底层实现,你根本不会遇到这种问题!!!!
如何让python调用c和c++**
3楼:匿名用户
1、可以用python的扩展来实现。可参考extending python with c or c++。
2、python本来是c实现的,封装二进制兼容的c++是很容易的。ava的话得通过jni来实现,就是说在python扩展里用c调用java。
3、另外,也可以写一个tcp服务来包装c++/java的接口,通过网络来调用,这样更通用。