在 Python 中使用 C++ DLL
Posted
技术标签:
【中文标题】在 Python 中使用 C++ DLL【英文标题】:Using C++ DLLs in Python 【发布时间】:2016-04-06 14:31:45 【问题描述】:如果这个问题在这里重复了很多次,我很抱歉,但我花了一整天都没有找到明确的答案。
我在 Visual Studio 2010 下工作,我正在尝试将 DLL 中定义的类加载到 Python 中。我看到如果不制作 C++ 包装器(最终使用 SWIG 或 Boost.Python),就无法做到这一点。我不是 C++ 程序员,我找不到一个简单明了的教程,如果你能给我一个简单的教程,我将不胜感激。
另外,我的班级使用单例模式,将其实例化限制为一个对象,如下所示:
MyClass* MyClass::getInstance()
if(instance==NULL)
instance = new MyClass();
return instance;
所以我需要知道如何在我的 Python 脚本中处理这个问题,以便我可以创建 MyClass 的一个实例并访问它的所有方法。
谢谢大家。
【问题讨论】:
boost.org/doc/libs/1_42_0/libs/python/doc/tutorial/doc/html/… 除了关于单例的一条评论外,您几乎没有告诉我们您的方案。你到底在为什么而苦苦挣扎,在swig.org/Doc3.0/SWIGPlus.html 中没有比我描述得更好? 其实我发的关于单身的那部分是我最需要的。我不知道如何在 Python 中处理指针。例如,我会这样做: import MyDLL instance = MyDLL.getInstance() instance.someMethod() 但我不是肯定会这么简单.. 【参考方案1】:找到问题的解决方案后,我会回来回答我的问题,它可能对谁有帮助。
我使用 SWIG 来制作 C++ 包装器。所以我定义了类似的模块接口:
%module MyClass
%
#include "MyClass.h"
%
%include <windows.i> //if you're using __declspec(dllexport) to export dll
%include "MyClass.h"
然后直接编译:
>swig -c++ -python MyClass.i
这会生成两个文件:MyClass.py 和 MyClass_wrap.cxx。
然后我将 MyClass_wrap.cxx 文件包含到我在 Visual Studio 中的项目中,并对我的项目属性进行了这些更改:
配置属性 > 常规 > 目标名称:_MyClass 目标扩展:.pyd
C/C++ > 常规 > 附加包含目录:/path/to/Python/include
链接器 > 其他库目录://path/to/Python/libs
然后编译项目生成_MyClass.pyd。
在我的 Python 脚本中,如下所示:
import MyClass
instance = MyClass.MyClass.getInstance()
#and then use all MyClass methods via instance, ex: instance.SomeMethod()
就是这样。 SWIG 完成所有工作来处理 getInstance() 返回的引用。
【讨论】:
以上是关于在 Python 中使用 C++ DLL的主要内容,如果未能解决你的问题,请参考以下文章
从 c++ 代码运行 python 脚本并在 c++ 中使用 pythons 输出