C 関数によって呼び出されるコールバックを持つ Python 呼び出しを作成する必要があります。Cヘッダーファイルには次のものがあります
...
typedef struct _myResponse {
char * data,
void (*setResponseFunc)(const char * const req, char ** dataptr);
} MyResponse_t
C ライブラリは、このようにコールバックを呼び出します
void process(const char * const req , MyResponse_t *response) {
response->SetResponseFunc("some request", &response->data);
}
C でのコールバックのサンプル コールバック実装:
void SetResponse(const char *respData, char **dataptr) {
char *ptr = malloc(strlen(respData));
strcpy(ptr, respData);
*dataptr= ptr;
}
次に、ctypesgen を使用して Python コードを生成します。生成されたファイルには次のものが含まれます。
エージェント.py:
def String:
...
class struct__myResponse(Structure):
pass
struct__myResponse.__slots__ = [
'data',
'SetResponseFunc',
]
struct__myResponse._fields_ = [
('data', String),
('SetResponseFunc', CFUNCTYPE(UNCHECKED(None), String, POINTER(String))),
]
これは私がそれを使用しようとした方法です
CALLBACK_FUNC = CFUNCTYPE(c_agent.UNCHECKED(None), agent.String, POINTER(agent.String))
def PyCopyResponse(a,b):
print "XXXXXX" // here, I haven't tried to implement the proper code, just want to see if the callback is called from the C library
copy_response = CALLBACK_FUNC(PyCopyResponse)
それを呼び出す
agentResp = agent.MyResponse_t(None,copy_response)
agent.process("some value",agentResp)
Python コールバックの実装がまったく呼び出されていません。C ライブラリがコールバックを適切に呼び出していることを確認しました。誰でも助けてもらえますか?