SWIG并从C代码触发Python回调

时间:2011-08-01 17:17:47

标签: swig

抱歉不熟悉这里的格式......我已经做了 一些进展感谢有用的回复,编辑和删除我的原始 问题被当前的问题所取代。

我的问题在于将C结构或结构指针转换为PyObject。那里 除此之外别无选择,因为我正在包装一个现有的C库 回调需要一个C结构指针。

以下作品但有限制:

%module cain1
%{

  typedef struct {
    double price;
    int volume;
  } book_entry_t;

  typedef struct {

    char symbol[10];
    book_entry_t *book;

  } trade_t;

  typedef void (*CALLBACK)(trade_t trade);

  CALLBACK my_callback = 0;
  static PyObject *my_pycallback = NULL;

  static void bigSnake(trade_t trade)
  {
    PyObject *result;

    PyObject *d1;

    result =  PyEval_CallObject(my_pycallback,

                Py_BuildValue("(y#)",
                          (char*)&trade,
                          sizeof(trade_t)
                          )

                );

    Py_XDECREF(result);
    return /*void*/;

  }

  void test_cb (PyObject *callMe1) {
    trade_t d1;
    book_entry_t b1;
    b1.price = 123.45;
    b1.volume = 99;


    Py_XINCREF(callMe1);         /* Add a reference to new callback */
    my_pycallback = callMe1;     /* Remember new callback */

    strcpy (d1.symbol,"Gupta Ltd");
    d1.book = &b1;


    bigSnake(d1);

  }


%}


// Expose in python module..
typedef struct {
  double price;
  int volume;
} book_entry_t;

typedef struct {

  char symbol[10];
  book_entry_t *book;

} trade_t;


void test_cb(PyObject *callMe1);

然后从Python触发回调:

import cain1
import struct 

def dave(d1):
    N1,N2 = struct.unpack('10sP', d1)
    print ('\n   %s: %x' % (N1.decode() ,N2))

    price,volume = struct.unpack('di',N2)

    print (price,volume)

def main():
    cain1.test_cb(dave) 

main()

但是我无法恢复trade_t指向的book_entry_t strcut内容....

我觉得这太复杂了,因为我有指向结构的指针 必须是Python直接使用它的方式,而不用大惊小怪。

2 个答案:

答案 0 :(得分:1)

Py_BuildValue("(N)",details)期望PyObject*(您的“N”表示如此),并且您传递的内容非常不同。请尝试使用Py_BuildValue("(i)", details.index),然后将其更改为适应details_t中的所有更改。

答案 1 :(得分:0)

您正在尝试从details_t结构构建PyObject。这是无效的。要么将回调传递给整数(似乎更容易,因为details_t只有一个字段)或者创建一个合适的PyObject类型。你不能盲目地将一种类型转换为另一种类型并期望它能够工作(PyObject不仅仅是一个指针)。