创建一个c++类的实例并在Python中调用它的方法
Creating an instance of a C++ class and calling methods on it in Python
我试图在我的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。
我建议两个解决方案:
- 你写了一些纯函数的c++代码,声明为'extern "C"',它暴露了你需要的功能。
- 我真的推荐使用Cython http://cython.org/,特别是http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html应该会帮助你。我经常使用它,对我来说,它是将c++代码包装到Python的最佳方式。
其他说明:
我试过几次boost python,但发现它很难使用。它有自己的构建系统,你必须学习,编译过程非常非常慢,而且由于模板语法,代码很难阅读。它认为boost python背后的上下文非常酷,但在我看来它很难使用。
我也试过SIP和SWIG,我觉得不太舒服。
我非常推荐使用Cython
相关文章:
- 从python调用openMP共享库时,未定义opnMP函数
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- 为什么我无法打开/读取从 Python 调用的 C 扩展名中的 txt 文件?
- 从 Python 调用 c++ 文件
- 如何为从 Python 调用C++启动 GDB?
- 从python调用C++函数,使用cython,使用cythonize
- 为什么在 2019 年我们仍然不能使用 ctypes 从 Python 调用C++?
- 如何使用 python 调用 c++ 函数
- 从 Python 调用 Windows DLL 函数时出错
- 如何从 Python 调用 MPI .so 文件
- 我如何有boost.python调用一个函数来处理对象
- 从Python调用的C++dll
- 通过嵌入式 Python 调用C++代码
- 从 Python 调用 cpp 函数时出现分段错误
- 从Python调用C++64位共享库
- 使用ctypes从Python调用C++方法不起作用
- Boost python,在嵌入时从python调用c ++函数
- 从 Python 调用 C++ opencv 函数(发送一个 cv :: mat 到 C++ 使用 opencv 的 d
- 从 Python 调用自定义C++ dll
- 如何使用Python调用C++代码