创建一个c++类的实例并在Python中调用它的方法

Creating an instance of a C++ class and calling methods on it in Python

本文关键字:Python 调用 方法 实例 创建 一个 c++      更新时间:2023-10-16

我试图在我的python应用程序中使用c++库。我可以在python中加载dll,但无法找到任何解决方案,如何创建一个类的实例,在该c++ dll中并调用该对象上的方法。

以下是我所做的和想要的

My.dll中的c++代码

class MyClass
{
  public:
    MyMethod(int param);
}

Python代码

from ctypes import *
myDll = windll.LoadLibrary("My.dll")

我想做以下操作

myClassInstance = myDll.InstantiateMyClass()
myClassInstance.MyMethod(5)

虽然它可能使用ctypes,但它肯定不会像那样简单。它会更容易使用,例如Boost。

用Ctypes加载c++ dll是危险的,并且有一些很强的限制。导出的函数名与您声明的不一样,除非您在c++中将函数声明为'extern "C"'。这只适用于纯函数,而不适用于成员函数。c++编译器会做一些叫做"名称mangling"的事情,参见http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_C.2B.2B。

我建议两个解决方案:

  1. 你写了一些纯函数的c++代码,声明为'extern "C"',它暴露了你需要的功能。
  2. 我真的推荐使用Cython http://cython.org/,特别是http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html应该会帮助你。我经常使用它,对我来说,它是将c++代码包装到Python的最佳方式。

其他说明:

我试过几次boost python,但发现它很难使用。它有自己的构建系统,你必须学习,编译过程非常非常慢,而且由于模板语法,代码很难阅读。它认为boost python背后的上下文非常酷,但在我看来它很难使用。

我也试过SIP和SWIG,我觉得不太舒服。

我非常推荐使用Cython