在Python中创建C++类实例并调用其方法

6 投票
2 回答
1464 浏览
提问于 2025-04-17 00:21

我正在尝试在我的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)

2 个回答

2

用Ctypes加载C++的dll是有风险的,并且有一些很大的限制。导出的函数名称和你在C++中声明的名称不一样,除非你在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中的最佳方式。

附加说明:

我尝试过几次boost python,但觉得使用起来很困难。它有自己的构建系统,你需要学习,编译过程非常非常慢,而且由于模板语法,代码变得难以阅读。我觉得boost python背后的理念很酷,但在我看来,使用起来很麻烦。

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

我真的推荐使用Cython。

4

虽然用ctypes可能可以做到,但绝对没有那么简单。用比如Boost.Python或者Cython来创建一个合适的CPython扩展,把那个类变成Python类型会简单得多。

撰写回答