функция обратного вызова pure-python вызывается с параметром b '', теряя фактические данные в функции cython - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь вызвать функцию обратного вызова в блоке cython cdef, я могу распечатать фактические данные во время вызова функции cython, но когда была вызвана моя функция обратного вызова или я вызываю print (buffer) в блоке cython cdef, я получил (paramter / result) с помощью b '', я пробую другую демонстрацию, все отлично работает.

windows 10, python3.7, cython

cython block
    cdef ikcp_output(self, char *buffer, int size):
        print("size: {}".format(size)) this can work
        for i in range(size):
            print(buffer[i]) # this can also works
        cdef char* o
        o = <char*> malloc(sizeof(char) * size)
        memcpy(o, buffer, size)
        for i in range(size): 
            print(o[i]) # this can also works
        print(o) # this output b''
        self.output(o) # the callback function get a parameter b''
        free(o)
start iter buffer
0
0
0
1
81
0
0
32
28
-50
-113
-50
0
0
0
0
0
0
0
0
49
50
49
51
50
49
51
49
51
49
50
10
start iter o
0
0
0
1
81
0
0
32
28
-50
-113
-50
0
0
0
0
0
0
0
0
49
50
49
51
50
49
51
49
51
49
50
10
32
b'' # this is what i got in callback function
client output
output data b'' to addr: ('127.0.0.1', 8888)

1 Ответ

1 голос
/ 03 июня 2019

Вызов print(o) или self.func(o) включает преобразование o в объект Python, в данном случае bytes объект.Это преобразование предполагает, что char* является строкой переменного тока (т. Е. Завершается нулем), поскольку у Cython нет другого способа определить длину.Однако ваш буфер начинается с 0, поэтому читается строка длиной 0

1007 *. Правильное решение - выполнить преобразование вручную, используя PyBytes_FromStringAndSize.Вы передаете это char* и длину строки (следовательно, не предполагает, что первый 0 является концом строки).Вы можете cimport это от cpython.bytes.
...