Как напрямую получить доступ к указателю списка Python для передачи в функцию C? - PullRequest
0 голосов
/ 05 сентября 2018

Я написал функцию C с именем SortInPlace, которая сортирует целочисленный массив на месте. Теперь я хочу позвонить из Питона. Ниже приводится ядро ​​моего кода:

def sort_in_place(vs):
    buffer = (c_void_p * len(vs))(*vs)
    lib.SortInPlace.argtypes = [c_void_p]
    lib.SortInPlace.restype = None
    lib.SortInPlace(buffer)
    print "buffer: ", buffer

vs = [3,2,1]
sort_in_place(vs)
print "vs: ", vs

Однако, результат оказывается

buffer: 1,2,3
vs: 3,2,1

Я напечатал адрес из buffer и vs, которые показывают, что они имеют разные адреса памяти . Таким образом, buffer сортируется на месте, но vs остается нетронутым.

Я также пытался использовать array для преобразования vs в указатель по:

from array import array
a = array('l',vs)

# however, their addresses are also different
print hex(id(vs))
print hex(a.buffer_info()[0])

В обоих случаях оригинал vs всегда копируется в новый буфер памяти. У меня вопрос: как я могу напрямую создать буфер из адреса объекта списка Python без копирования?

...