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

2021-01-11 19:09:15 字数 1903 阅读 8427

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的接口,通过网络来调用,这样更通用。