📜  如何从Python调用 C/C++?

📅  最后修改于: 2022-05-13 01:55:11.921000             🧑  作者: Mango

如何从Python调用 C/C++?

为了利用这两种语言的优势,开发人员使用Python绑定,这允许他们从Python调用 C/C++ 库。

现在,问题出现了,为什么需要这样做?

  1. 众所周知,C 具有更快的执行速度,并且为了克服PythonPython很有帮助。
  2. 我们有一个大型、稳定且经过测试的 C/C++ 库,使用起来非常方便。
  3. 用于使用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!!!