我刚刚开始使用ctypes,并希望使用C++类,我已经使用ctypes在python中导出了一个dll文件.那么就说我的C++代码看起来像这样:
class MyClass {
public:
int test();
...
Run Code Online (Sandbox Code Playgroud)
我会知道创建一个包含该类的.dll文件,然后使用ctypes在python中加载.dll文件.现在我如何创建一个MyClass类型的Object并调用它的测试函数?这对ctypes来说甚至可能吗?或者我会考虑使用SWIG或Boost.Python,但ctypes似乎是小项目最简单的选择.
我正在寻找一种简单的方法将C++类实例暴露给python嵌入式解释器.
我想将我的C++世界Foo实例暴露给python世界(并被视为Foo类).
这是可能的,如果是这样,怎么样?
我认为这几乎就像在第一个答案中: boost :: python :: ptr或PyInstance_New用法
我想这意味着我应该boost.Python用来包装我的图书馆?
我唯一的目标是在嵌入式python解释器中操作我的Coo Coo实例(不确定它是否可以使用前面的方法完成).
希望我很清楚,谢谢你的帮助.
更新
谢谢你的回答.事实上,我已经将我的Foo类暴露给python(使用swig).
是)我有的:
我的Foo课程:
class Foo{...};
Run Code Online (Sandbox Code Playgroud)
我的包装库(包括Foo类)暴露给python:所以我可以启动python解释器并执行以下操作:
import my_module
foo=my_modulde.Foo()
Run Code Online (Sandbox Code Playgroud)
我想要的是:
有一个C++主程序嵌入python解释器并操纵C++世界变量.
int main(int argc, char **argv)
{
Foo foo; // instanciates foo
Py_Initialize();
Py_Main(argc, argv); // starts the python interpreter
// and manipulates THE foo instance in it
Py_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在更清楚了吗?:)
我有两个C++类,Container和Item,看起来像:
class Item{
public:
Item(std::string* name,int id);
std::string* getName();
private:
std::string* name;
int id;
};
class Container {
public:
Container();
Item* getItem(int id);
private:
std::vector<Item*> items;
};
Run Code Online (Sandbox Code Playgroud)
我想在Python中创建和使用Container,所以我编写了一个C接口来编译共享库:
extern "C" {
Container* Container_init(){return new Container();}
Item* Container_getItem(Container* container,int id){return container->getItem(id);}
std::string* Item_getName(Item* item){return item->getName();}
}
Run Code Online (Sandbox Code Playgroud)
和一个Python包装器:
from ctypes import *
lib = cdll.LoadLibrary(myLibPath)
class Item(object):
def getName(self):
return lib.Item_getName(self.obj)
class Container(object):
def __init__(self):
self.obj = lib.Container_init()
def getItem(self,id):
return lib.Container_getItem(self.obj,id)
lib.Container_getItem.restype = Item
lib.Container_getItem.argtypes = [c_void_p,c_int]
c = Container()
print …Run Code Online (Sandbox Code Playgroud)