如何从Python调用 C/C++?
为了利用这两种语言的优势,开发人员使用Python绑定,这允许他们从Python调用 C/C++ 库。
现在,问题出现了,为什么需要这样做?
- 众所周知,C 具有更快的执行速度,并且为了克服PythonPython很有帮助。
- 我们有一个大型、稳定且经过测试的 C/C++ 库,使用起来非常方便。
- 用于使用Python测试工具对系统进行大规模测试。
让我们看看我们想用Python执行的 C 代码:
C++
#include
class Geek{
public:
void myFunction(){
std::cout << "Hello Geek!!!" << std::endl;
}
};
int main()
{
// Creating an object
Geek t;
// Calling function
t.myFunction();
return 0;
}
C++
extern "C" {
Geek* Geek_new(){ return new Geek(); }
void Geek_myFunction(Geek* geek){ geek -> myFunction(); }
}
Python3
# import the module
from ctypes import cdll
# load the library
lib = cdll.LoadLibrary('./libgeek.so')
# create a Geek class
class Geek(object):
# constructor
def __init__(self):
# attribute
self.obj = lib.Geek_new()
# define method
def myFunction(self):
lib.Geek_myFunction(self.obj)
# create a Geek class object
f = Geek()
# object method calling
f.myFunction()
我们必须将这些 cpp 声明提供为 extern “C”,因为 ctypes 只能与 C 函数交互。
C++
extern "C" {
Geek* Geek_new(){ return new Geek(); }
void Geek_myFunction(Geek* geek){ geek -> myFunction(); }
}
现在,将此代码编译到共享库:
最后,编写Python包装器:
Python3
# import the module
from ctypes import cdll
# load the library
lib = cdll.LoadLibrary('./libgeek.so')
# create a Geek class
class Geek(object):
# constructor
def __init__(self):
# attribute
self.obj = lib.Geek_new()
# define method
def myFunction(self):
lib.Geek_myFunction(self.obj)
# create a Geek class object
f = Geek()
# object method calling
f.myFunction()
输出 :
Hello Geek!!!