在 Python 中使用 C++ DLL
Using C++ DLLs in Python
如果这个问题在这里重复了很多次,我很抱歉,但我花了一整天都没有找到明确的答案。
我在 Visual Studio 2010 下工作,我正在尝试将 DLL 中定义的 class 加载到 Python 中。我看到如果不制作 C++ 包装器(最终使用 SWIG 或 Boost.Python)就无法做到这一点。我不是 C++ 程序员,我找不到一个简单明了的入门教程,如果你能给我一个简单的教程,我将不胜感激。
此外,我的 class 使用单例模式将其实例化限制为一个对象,如下所示:
MyClass* MyClass::getInstance()
{
if(instance==NULL)
instance = new MyClass();
return instance;
}
所以我需要知道如何在我的 Python 脚本中处理这个问题,以便我可以创建 MyClass 的实例并访问它的所有方法。
谢谢大家。
找到问题的解决方案后,我回来回答我的问题,可能对谁有帮助。
我使用 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.
然后我在 Visual Studio 中将 MyClass_wrap.cxx 文件包含到我的项目中,并对我的项目属性进行了这些更改:
配置属性 > 常规 > 目标名称:_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() 返回的引用。
如果这个问题在这里重复了很多次,我很抱歉,但我花了一整天都没有找到明确的答案。
我在 Visual Studio 2010 下工作,我正在尝试将 DLL 中定义的 class 加载到 Python 中。我看到如果不制作 C++ 包装器(最终使用 SWIG 或 Boost.Python)就无法做到这一点。我不是 C++ 程序员,我找不到一个简单明了的入门教程,如果你能给我一个简单的教程,我将不胜感激。
此外,我的 class 使用单例模式将其实例化限制为一个对象,如下所示:
MyClass* MyClass::getInstance()
{
if(instance==NULL)
instance = new MyClass();
return instance;
}
所以我需要知道如何在我的 Python 脚本中处理这个问题,以便我可以创建 MyClass 的实例并访问它的所有方法。
谢谢大家。
找到问题的解决方案后,我回来回答我的问题,可能对谁有帮助。
我使用 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.
然后我在 Visual Studio 中将 MyClass_wrap.cxx 文件包含到我的项目中,并对我的项目属性进行了这些更改:
配置属性 > 常规 > 目标名称:_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() 返回的引用。