Python将任意非调用者/非自我类实例传递给C

时间:2015-10-17 05:32:26

标签: python c++ ctypes typeerror

我实现了一个通用优先级队列,它将int作为键,任何类实例作为元素;将这些任何称为节点。该算法将在python中进行原型化,但在C ++中实现。我试图找出python接口部分。这是C ++代码

queue.c ++

#include <Python.h>
#include <vector>
#include <iostream>

class PQueue
{
public:
    PQueue()
    {
        Q = std::vector<PyObject *>();
    }

    void insert(PyObject *node)  
    {
        Q.push_back(node);
        std::cout << "Added a node" << std::endl;
    }

private:
    std::vector<PyObject *> Q;
};

extern "C"
{
    PQueue *PQueue_new() 
        { return new PQueue(); }
    void PQueue_insert(PQueue *self, PyObject *n)   /* This fails */
        { self->insert(n); }  
}

这里是相应的python原型:

queue.py

import ctypes
lib = ctypes.cdll.LoadLibrary('./libqueue.so')

class PriorityQueue(object):
    def __init__(self):
        self.obj = lib.PQueue_new();

    def insert(self, n):  # this fails
        lib.PQueue_insert(self.obj, n );

变量n是表示节点的任意类实例。我想使用 PyObject_CallMethodObjArgs 访问n的成员变量,但由于以下错误,我无法这样做:

lib.PQueue_insert(self.obj, n );
ctypes.ArgumentError: argument 2: <class 'TypeError'>: Don't know how to convert parameter 2

我认为python类不是C原语,但PyObject存在的事实使我相信这样的事情应该是可能的。

0 个答案:

没有答案