pythonctypes:用操作符包装c++类

2024-10-05 22:01:52 发布

您现在位置:Python中文网/ 问答频道 /正文

< P>我想用Cype包装一个小的测试C++类,用于Python。这个类叫做Edge,有一个友元比较(==)运算符。我很难在包装器python代码中实现比较特性。在

简洁的Edge标题是:

class Edge {
    private:
        int p1, p2;
    public:
        Edge(const int pp1, const int pp2);
        ~Edge(){};
        friend bool operator==(const Edge &e1, const Edge &e2);
};

我编写的python包装器是:

^{pr2}$

>,EdgEnEngor和CuffReSead是C++例程,定义为:

#include "Edge.hpp"

extern "C" {
    Edge* Edge_new(const Int32 pp1, const Int32 pp2) { return new Edge(pp1, pp2); }

    bool compare_edge(Edge *e1, Edge *e2) {
        return *e1 == *e2;
    }
}

建造师工作得很好。当我比较两个边缘对象e1 == e2时,我得到以下类型错误:

Traceback (most recent call last):   File "Edge.py", line 21, in <module>
    print e1 == e2   File "Edge.py", line 16, in __eq__
    return lib.compare_edge(self.obj, c_void_p(other)) TypeError: cannot be converted to pointer

我确实理解错误的含义,以及最可能的出错原因,但我不知道如何修复它。我用GCC 4.7编译C++代码,Python解释器是64位。在


Tags: 代码newreturn错误intcomparebooledge
1条回答
网友
1楼 · 发布于 2024-10-05 22:01:52

问题是,您试图将Python对象强制转换为void *,而不是已经附加到该对象的obj属性的void *。在

就像改变一样简单。。。在

def __eq__(self, other):
    return lib.compare_edge(self.obj, c_void_p(other))

…到。。。在

^{pr2}$

显式调用c_void_p应该是不必要的,因为您已经在行中声明了类型。。。在

lib.compare_edge.argtypes = [c_void_p, c_void_p]

相关问题 更多 >