在 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.pyMyClass_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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中使用 C++ 类?

如何使用从 C++ 发送的地址在 python 中获取值?

使用ctypes在Python中调用C++动态库

从 c++ 代码运行 python 脚本并在 c++ 中使用 pythons 输出

无法使用 SWIG 在 Python 中实例化 C++ 类(获取属性错误)

如何在 Python 中结束函数,就像在 C++ 中使用“return”一样 [关闭]