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

时间:2011-08-25 19:31:14

标签: c++ python dll instantiation

我正在尝试在我的python应用程序中使用C ++库。我可以在python中加载dll但是找不到任何关于如何在c ++ dll中创建类的实例并在该onject上调用方法的解决方案。

以下是我所做和想要的事情

My.dll中的C ++代码

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

Python代码

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

我想执行以下操作

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

2 个答案:

答案 0 :(得分:4)

虽然可能可以使用ctypes,但它肯定不会那么简单。它会更容易使用,例如Boost.PythonCython创建一个适当的CPython扩展,将该类公开为Python类型。

答案 1 :(得分:2)

使用Ctypes加载C ++ dll是危险的,并且有一些强大的局限性。导出的函数名称与您声明的函数名称不同,除非您在C ++中将函数声明为'extern“C”'。这仅适用于纯函数,不适用于成员函数。 C ++编译器执行称为“名称修改”的操作,请参阅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的最佳方式。
  3. 附加说明:

    我尝试过一段时间来提升python,但发现它很难使用。它有自己的构建系统,你必须学习,编译过程非常慢,并且由于模板语法,代码难以阅读。事实上,boost python背后的背景非常酷,但在我看来它很难使用。

    我也尝试了SIP和SWIG,我感觉不太舒服。

    我真的建议使用Cython。