抱歉不熟悉这里的格式......我已经做了 一些进展感谢有用的回复,编辑和删除我的原始 问题被当前的问题所取代。
我的问题在于将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直接使用它的方式,而不用大惊小怪。
答案 0 :(得分:1)
Py_BuildValue("(N)",details)
期望PyObject*
(您的“N”表示如此),并且您传递的内容非常不同。请尝试使用Py_BuildValue("(i)", details.index)
,然后将其更改为适应details_t
中的所有更改。
答案 1 :(得分:0)
您正在尝试从details_t
结构构建PyObject。这是无效的。要么将回调传递给整数(似乎更容易,因为details_t
只有一个字段)或者创建一个合适的PyObject类型。你不能盲目地将一种类型转换为另一种类型并期望它能够工作(PyObject不仅仅是一个指针)。