相关疑难解决方法(0)

如何使用ctypes的C++类?

我刚刚开始使用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 ctypes

52
推荐指数
3
解决办法
5万
查看次数

将C++类实例暴露给python嵌入式解释器

我正在寻找一种简单的方法将C++类实例暴露给python嵌入式解释器.

  • 我有一个C++库.这个库被包装(暂时使用swig),我可以从python解释器中使用它
  • 我有一个C++主程序,它从我的库中实现了一个Foo类并嵌入了一个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++ python swig boost boost-python

19
推荐指数
2
解决办法
5653
查看次数

如何使用ctypes从C++函数返回对象?

我有两个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)

c++ python ctypes

4
推荐指数
1
解决办法
1664
查看次数

标签 统计

c++ ×3

python ×3

ctypes ×2

boost ×1

boost-python ×1

swig ×1