1

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 ライブラリがコールバックを適切に呼び出していることを確認しました。誰でも助けてもらえますか?

4

1 に答える 1

0

わかりました、問題が見つかりました。プロセスは構造体へのポインターを受け取ります。私は構造体を直接渡していました。

data = agent.String() 
agentResp = agent.MyResponse_t(data,copy_response)
agentResp_p = pointer(agentResp)

agent.process("some value",agentResp_p)
于 2012-10-15T22:06:06.240 に答える